python嵌套for循环只执行一次

时间:2015-07-10 08:53:35

标签: python csv

我有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循环。知道问题是什么吗?

2 个答案:

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