【问题标题】:Unable to iterate "csv.reader" repeatedly - empty result on second iteration无法重复迭代“csv.reader” - 第二次迭代时结果为空
【发布时间】:2018-01-01 12:22:55
【问题描述】:

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

下面是我正在努力解决的场景,内部循环,遍历 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


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-08
          • 2018-06-17
          • 2021-04-22
          • 2013-09-21
          • 2020-07-01
          • 2022-11-18
          • 2023-04-02
          相关资源
          最近更新 更多