根据python中的列值选择csv的特定行

时间:2019-07-04 16:07:10

标签: python csv

我有一个正在使用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}我不确定这种格式是否正确。

请注意,由于不受我的控制,我故意不使用数据框架库,例如熊猫。

5 个答案:

答案 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