无法迭代“csv.reader“在第二次迭代中重复空结果

2024-04-26 13:45:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

csv内容:

Field1
row1
row2
row3

代码:

^{pr2}$

预期结果:

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")

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


Tags: csv方法infor标识uniquesumrow1
3条回答

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

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

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

在使用A循环之后,读取器迭代器将位于所有数据的后面。 你必须重新定位到一开始,但你为什么要这样做?在

最好将所有数据保存到一个列表中,然后重用它。在

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

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

^{}返回一个reader对象,该对象是迭代器。所以,一旦你迭代整个列表,它就会变成空的。您需要将读卡器另存为list,以便重复迭代它。在

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

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

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

^{pr2}$

相关问题 更多 >