Skip to main content
 首页 » 编程设计

python之无法重复迭代 "csv.reader"- 第二次迭代的结果为空

2025年05月04日23del

我创建了 list1 以包含来自特定列的唯一值,方法是附加标识为唯一的值以执行某种“sum if”。

下面是我遇到的情况,内部循环,遍历 csv 行只执行一次。是否有一些特殊的特征使得在嵌套循环的内部循环中遍历 csv 文件中的行有问题?

csv 内容:

Field1 
row1 
row2 
row3 

代码:

datafile = open(r"my_file.csv", "r") 
myreader = csv.reader(datafile, delimiter=",") 
 
list1 = ["A", "B", "C"] 
 
for x in list1[:]: 
    print(x) 
        for y in myreader: 
               print(y) 

预期结果:

A 
row1 
row2 
row3 
B 
row1 
row2 
row3 
C 
row1 
row2 
row3 

实际结果:

A 
row1 
row2 
row3< 
B 
C 

似乎只有内部循环的初始迭代在工作。

如果我用另一个列表替换 csv,它工作正常:

datafile = open(r"my_file.csv", "r") 
myreader = csv.reader(datafile, delimiter=",") 
 
list1 = ["A", "B", "C"] 
list2 = ["row1", "row2", "row2"] 
 
for x in list2[:]: 
    print(x) 
        for y in list2: 
               print(y) 

给出预期的结果

我可以在单个循环中遍历 csv 行,下面没有问题:

x = 0 
for y in myreader: 
        x = x + 1 
        print(y[2] + " INNER") 

那么为什么它们不能一起工作呢?

请您参考如下方法:

csv.reader返回一个 reader 对象,它是一个迭代器。所以,一旦你遍历了整个列表,它就变成了空的。您需要将阅读器保存为 列表,以便重复迭代它。

为了实现这一点,您需要更改:

myreader = list(csv.reader(datafile, delimiter=",")) 
#           ^ it'll save `myreader` as list 

因此,您完整的代码应该是:

datafile = open(r"my_file.csv", "r") 
myreader = list(csv.reader(datafile, delimiter=","))     
#           ^ converting the `iterator` to list type 
 
list1 = ["A", "B", "C"] 
 
#            v  I removed "[:]" from here because it is not required 
#            v  `list1[:]` creates a copy of the list "list1". You  
#            v  don't need copy here 
for x in list1: 
    print(x) 
    for y in myreader: 
        print(y)