循环一次向lis添加一行

2024-09-27 18:08:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码来创建一个ItemID和其他功能的列表,这些功能从csv创建其他列表。我试过编写一个函数来循环,每次向其他列表添加一行(为每个ItemID添加一个新的price行),而不是每个循环都创建完整的列表。你知道吗

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构建ID列表,getPrice是我试图重写的函数,每次只从buildObject中的csv every循环添加一行。你知道吗


Tags: csvin列表forasopenrow2dictreader
1条回答
网友
1楼 · 发布于 2024-09-27 18:08:16

这是一个设计问题。从磁盘读取文件是一项昂贵的操作,只需执行一次。在内存中加载两个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

相关问题 更多 >

    热门问题