我有2个csv文件。我在一个csv中得到一个单元格的值,并与另一个csv中的所有单元进行比较。以下是我的代码:
f = open('test1.csv')
x = open('test2.csv')
csv_f = csv.reader(f)
csv_x = csv.reader(x)
for row in csv_f:
a = row[1]
b = row[2]
for nrow in csv_x:
if a in nrow[0] and b in nrow[1]:
print nrow[0]
现在上面的代码只打印a和b的第一个值。随后,对于a和b的其他值,它不会通过第二个for循环。知道问题是什么吗?
答案 0 :(得分:3)
功能
csv_x = csv.reader(x)
返回文件对象。
一旦它结束就会循环播放。
所以你再也无法循环了
要解决这个问题,你可以这样使用
f = open('test1.csv')
csv_f = csv.reader(f)
for row in csv_f:
a = row[1]
b = row[2]
csv_x = csv.reader(open('test2.csv')) # assign here
for nrow in csv_x:
if a in nrow[0] and b in nrow[1]:
print nrow[0]
答案 1 :(得分:2)
是的,正确,因为在第一个循环之后,文件x
(基于其创建csv阅读器csv_x
位于文件的末尾,并且不再有行从中读取,因此在第一次循环后它不会再次遍历它。
对于第二个文件(为了性能),您可以考虑使用简单文件,然后在开始任何循环之前创建列表,这样您就不必一次又一次地读取同一文件。
示例 -
f = open('test1.csv')
x = open('test2.csv')
csv_x = csv.reader(x)
xlist = [i for i in csv_x] #If your csv is delimited by ',' , which I am guessing it is.
csv_f = csv.reader(f)
for row in csv_f:
a = row[1]
b = row[2]
for nrow in xlist:
if a in nrow[0] and b in nrow[1]:
print nrow[0]