无法重复迭代“csv.reader” - 第二次迭代时结果为空

Chi*_*ers 1 python csv list nested-loops python-3.x

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

下面是我正在努力解决的场景,内部循环,遍历 csv 行只执行一次。是否有一些特殊的特性使得在嵌套循环的内循环中迭代 csv 文件中的行有问题?

.csv 内容:

Field1
row1
row2
row3
Run Code Online (Sandbox Code Playgroud)

代码:

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)
Run Code Online (Sandbox Code Playgroud)

预期结果:

A
row1
row2
row3
B
row1
row2
row3
C
row1
row2
row3
Run Code Online (Sandbox Code Playgroud)

实际结果:

A
row1
row2
row3<
B
C
Run Code Online (Sandbox Code Playgroud)

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

如果我用另一个列表替换 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)
Run Code Online (Sandbox Code Playgroud)

给出预期结果

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

x = 0
for y in myreader:
        x = x + 1
        print(y[2] + " INNER")
Run Code Online (Sandbox Code Playgroud)

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

Moi*_*dri 5

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

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

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

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

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)
Run Code Online (Sandbox Code Playgroud)