0

我正在尝试从我的 csv 文件中读取我的内容,对其进行迭代以查找某些字符串,然后在找到所述字符串时添加带有新字符串的另一行和一列。例如,我试图遍历文件以查找字符串面粉(但数据类型表示它的对象,我假设的字符串值),如果在该列中找到面粉,我可以附加一个名为 Allergen1 的新行并将其称为 Gluten。计划是对更多的过敏原做同样的事情。就像 Allergen2 会是鸡蛋等。以下是我到目前为止所拥有的。

CSV 看起来像这样。它太大了,我无法在这里输入,但这里是原始 csv 文件的链接。在此处输入链接描述

本节让我添加一个名为 Allergen1 的新行并在该列中插入“面粉”。使用时,它本身就可以正常工作。testing.csv 只是我在本地制作的一个文件,因此我可以测试结果。

input_file = pd.read_csv('recipes.csv')
input_file['Allergen2'] = 'flour'
input_file.to_csv('testing.csv', index=False) 

这就是我到目前为止所拥有的,只是一个基本的迭代。我尝试了不同的 pandas 和 python 方式来读取 csv 文件。

input_file = csv.DictReader(open('recipes.csv'))
for row in input_file:
if ('flour') in row.values():
    input_file['Allergen100'] = 'Gluten'
    input_file.to_csv('testing.csv', index = False)

我的问题是迭代工作得很好,它从我的 csv 打印每一行。我只是不知道如何在我的 if 语句中使用我从上面添加的新行和列段。我得到的错误是

TypeError:“DictReader”对象不支持项目分配

有谁知道这是什么意思,我该如何解决?

4

1 回答 1

1

csv 模块是一个非常基本的模块,不包含 pandas 的任何花哨的方面。特别是, csv.DictReader 实际上并没有将任何内容写入内存,因此没有要更新的数组(与 pandas 不同);而是 csv.DictReader 只返回 csv 文件的每一行,一次一个。如果您不将这些行保存到新变量中,那么它们将被丢弃。csv 模块在想要处理 100 GB csv 文件但只有 10 GB RAM 的情况下会很有帮助。csv 模块允许您逐行读取 csv 文件并根据您阅读的内容执行操作。另一方面,Pandas 会尝试将整个 csv 文件打开到内存中,这样您就可以在重写新的 csv 文件之前即时更新内存。

如果将 csv.DictReader 包装在 list() 中,您将遍历所有行并将整个文件读入内存。

#Read
f = open('recipes.csv')
input_file = list(csv.DictReader(f))
for row in input_file:
    if 'flour' in row.values():
        row['Allergen100'] = 'Gluten'
f.close()

#Write
f = open('testing.csv','w')
output_file = csv.DictWriter(f,input_file[0].keys())
output_file.writeheader()
output_file.writerows(input_file)
f.close()
于 2020-05-19T18:47:16.100 回答