我正在尝试创建一个循环,在csv文件中搜索具有公共第3和第4列的行,并对它们执行操作。
我的文件看起来像这样:
name1,x,y,z,notes
name2,a,b,c,notes
name3,a,y,z,notes
我使用的代码读取第一行并标识row [2]和row [3]并执行搜索文件中所有行的列组合。不幸的是,我似乎无法弄清楚如何实际搜索它们。
for row in csvfile:
row_identify = row[2:3]
for row in csvfile:
if row_identify in row:
print row
else:
print "not here"
我希望它打印第一行和第三行(因为y和z将是row_identify)。我假设我可以明确声明我想搜索那些行,但这似乎不起作用。我也尝试过使用
row_identify = str(row[2]),str(row[3])
但这似乎也不起作用。
答案 0 :(得分:3)
您可以创建一个对词典,其中键是包含标识列的元组,值是类似行的列表:
>>> import collections
>>> similarities = collections.defaultdict(list)
>>> for row in csvfile:
... similarities[(row[2], row[3])].append(row)
>>> print similarities
{('y', 'z'): [['name1', 'x', 'y', 'z', 'notes'],
['name3', 'a', 'y', 'z', 'notes']],
('b', 'c'): [['name2', 'a', 'b', 'c', 'notes']]
}
答案 1 :(得分:-1)
如果您要查找与第一行具有相同第3和第4列的行:
import csv
import operator
key = operator.itemgetter(2,3)
with open('path/to/input') as infile:
rows = csv.reader(infile)
holyGrail = key(next(rows))
for row in rows:
if key(row) != holyGrail:
continue
do_stuff(row)
如果你想要一个更通用的版本,聚集所有共享类似的第3和第4列的行,那么:
import csv
import operator
from collections import defaultdict as dd
key = operator.itemgetter(2,3)
info = operator.itemgetter(0,1)
similarities = dd(list)
with open('path/to/input') as infile:
for i,row in enumerate(csv.reader(infile)):
similarities[key(row)].append((i,info(row)))
for k, rows in similarities.items():
print("These following rows all have the id <{}> (the data follows):".format(k), ', '.join([str(i) for i,_ in rows]))
print('\n'.join(['\t' + '\t'.join([row]) for _,row in rows])