Цикл, чтобы добавить одну строку за раз в список - PullRequest
0 голосов
/ 22 октября 2018

У меня есть код ниже, чтобы создать список ItemID's и другие функции, которые создают другие списки из CSV.Я попытался написать функцию для создания цикла и добавления одной строки за раз в другие списки (для каждого ItemID добавьте новую строку цены) вместо каждого цикла, создающего полный список.

def Main(filename1, filename2):
    with open(filename1, "r") as csv1, open(filename2, "r") as csv2:  
        csvReader1 = csv.DictReader(csv1)
        csvReader2 = csv.DictReader(csv2)

        ItemIDList = []
        for row1, row2 in zip(csvReader1, csvReader2):  
          ItemIDList.append((row2["ItemId"]))
    return ItemIDList

def buildObject(ItemIDList):

    for row in ItemIDList: getPrice(filename1, filename2)
    for row in ItemIDList: NameList = getName(filename1, filename2)

def getPrice(filename1, filename2):
    with open(filename1, "r") as csv1, open(filename2, "r") as csv2:  
        csvReader1 = csv.DictReader(csv1)
        csvReader2 = csv.DictReader(csv2)

        priceList = []
        for row1, row2 in zip(csvReader1, csvReader2):  
          csvPVList.append((row2["Price"]))
        return priceList

Mainсоздает список идентификаторов, getPrice - это функция, которую я пытаюсь переписать, чтобы добавить только одну строку за раз из каждого цикла csv в buildObject.

1 Ответ

0 голосов
/ 23 октября 2018

Это проблема дизайна.Чтение файлов с диска является дорогостоящей операцией и должно выполняться только один раз.И загрузка обоих CSV-файлов в память для их архивирования неэффективна для памяти.Поэтому вы должны:

  • иметь один метод / функцию извлечения, который считывает оба файла по одной строке за раз и передает списки (или списки кортежей / namedtuples / объектов) со всеми данными, которые будут следующимииспользуется
  • иметь этот экстрактор для возврата этих списков

Код может быть (очень упрощенный, без обработки ошибок), если используются отдельные списки:

def extract_data(filename1, filename2):
    with open(filename1, "r") as csv1, open(filename2, "r") as csv2:  
        csvReader1 = csv.DictReader(csv1)
        csvReader2 = csv.DictReader(csv2)

        ItemIDList = []
        priceList = []
        for row1 in csvReader1:
            row2 = next(csvReader2)
            ItemIDList.append(row2["ItemId"])
            priceList.append(row2["Price"])
            ...                                    # eventually extract other fields
    return ItemIDList, priceList

Илипри использовании namedtuples:

from collections import namedtuple
Record = namedtuple("ItemId", "Price")
...
            recordList = []
            for row1 in csvReader1:
                row2 = next(csvReader2)
                recordList.append(Record(row2["ItemId"],row2["Price"]))
        return recordList
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...