我有一个正在使用DictReader读取的csv文件,并且我想根据“名称”列中的值是否与我作为列表给出的名称相匹配来选择文件的行。
文件如下:
Name Age Gender
Matt 22 M
Jen 21 F
Greg 22 M
我已经尝试过类似的操作,但是行返回为空
file = csv.DictReader("file.csv',fieldnames=fieldnames,delimiter='~')
Names = ['Greg', Jen']
for i in Names:
rows = [row for row in file if row['Name'] == i]
我希望代码将以下内容作为行产生:{Jen: 21: F, Greg: 22: M}
我不确定这种格式是否正确。
请注意,由于不受我的控制,我故意不使用数据框架库,例如熊猫。
答案 0 :(得分:0)
property int rowHeight: textArea.font.pixelSize+3
的引号不匹配:应为"file.csv'
或"file.csv"
。 'file.csv'
中缺少引号;它应该是Names = ['Greg', Jen']
。分隔符应为Names = ['Greg', 'Jen']
(空格)。在调用' '
方法之前,您需要打开文件。最后:可以简化for循环。
工作代码示例:
Dicctreader
在example.csv文件中:
import csv
with open('example.csv', newline='') as csvfile:
file = csv.DictReader(csvfile, delimiter=' ')
Names = ['Greg', 'Jen']
print(file)
rows = [row for row in file if row['Name'] in Names]
答案 1 :(得分:0)
您在循环中使用了运算符==
。删除循环并使用运算符in
rows = [row for row in file if row['Name'] in Names]
答案 2 :(得分:0)
对行进行一次迭代比对每个名称对行进行迭代更有效。在大文件上尤其如此。
filtered_rows = []
for row in file:
if row['Name'] in Names:
filtered_rows.append(row)
使用列表理解的相同解决方案
filtered_rows = [
row
for row in file
if row['Name'] in Names
]
答案 3 :(得分:0)
您读取csv文件的方式不正确csv.DictReader example。该代码应该起作用:
Names = ["Greg", "Jen"]
with open("csvFile.csv", newline='') as csvfile:
reader = csv.DictReader(csvfile)
rows = [row for row in reader if row['Name'] in Names]
print(rows)
输出为:
[{'Gender': 'F', 'Name': 'Jen', 'Age': '21'}, {'Gender': ' M', 'Name': 'Greg', 'Age': '22'}]
答案 4 :(得分:0)
您没有正确打开文件。 将分界符和代码更改为此:
from csv import DictReader
with open('test.csv', mode='r') as csv_file:
file = DictReader(csv_file,delimiter=';')
Names = ['Greg', 'Jen']
rows = [row for row in file if row['Name'] in Names]
print(rows)
我得到的输出是:
[{'Gender': 'M', 'Name ': 'Greg ', 'Age ': '22'},{'Gender': 'F', 'Name ': 'Jen ', 'Age ': '21'}]
如果您想进一步了解使用python的csv,请选中此link