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

问题描述 投票:1回答:3

我创建了list1,通过附加标识为唯一的值来包含特定列中的唯一值,以便执行一种“总和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")

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

python python-3.x list csv nested-loops
3个回答
2
投票

csv.reader返回一个reader对象,它是一个迭代器。因此,一旦迭代整个列表,它就会变空。您需要将您的阅读器保存为list,以便反复迭代它。

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

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)

1
投票

使用A进行循环后,您的读取器迭代器将包含所有数据。您必须重新定位它,但为什么要这样做?

最好将所有数据保存到列表中然后重复使用。

myData = list(myreader) # this will iterate the whole file and put all in a list.

https://docs.python.org/3/library/csv.html


1
投票

myreader是一个迭代器,在第一次迭代后会耗尽。将其转换为列表以获得所需的输出。

csv_rows = list(myreader)
for x in list1[:]:
    print(x)
        for y in csv_rows:
               print(y)

迭代器只允许一次迭代。另一方面,列表可以反复迭代。迭代器的优点是不会立即将所有元素加载到内存中。如果文件很大,这可能很重要。在这种情况下,列表可能会消耗大量内存。

© www.soinside.com 2019 - 2024. All rights reserved.