【问题标题】:Why can't I repeat the 'for' loop for csv.Reader?为什么我不能为 csv.Reader 重复“for”循环?
【发布时间】:2012-06-24 09:29:58
【问题描述】:

我是 Python 的初学者。我现在正在尝试弄清楚为什么第二个“for”循环在以下脚本中不起作用。我的意思是我只能得到第一个“for”循环的结果,而第二个循环却什么也得不到。我在下面复制并粘贴了我的脚本和数据 csv。

如果你告诉我为什么会这样以及如何使第二个“for”循环也能正常工作,那将会很有帮助。

我的脚本:

import csv

file = "data.csv"

fh = open(file, 'rb')
read = csv.DictReader(fh)

for e in read:
    print(e['a'])

for e in read:
    print(e['b'])

“数据.csv”:

a,b,c
tree,bough,trunk
animal,leg,trunk
fish,fin,body

【问题讨论】:

    标签: python csv


    【解决方案1】:

    csv 阅读器是文件的迭代器。一旦你读过一次,你就读到了文件的末尾,所以没有更多的东西要读了。如果需要再过一遍,可以找文件开头:

    fh.seek(0)
    

    这会将文件重置为开头,以便您再次阅读。根据代码,可能还需要跳过字段名称标题:

    next(fh)
    

    这对于您的代码是必要的,因为 DictReader 第一次使用该行以确定字段名称,并且不会再这样做。 csv 的其他用途可能不需要。

    如果文件不是太大并且您需要对数据做几件事,您也可以将整个内容读入一个列表:

    data = list(read)
    

    然后你可以用data做你想做的事。

    【讨论】:

    • @SIslam:是的,如果我没听错的话。如果您遍历一个文件,那么当您到达末尾时,您已经用尽了迭代器并且无法再读取任何内容,除非您回到开头。
    【解决方案2】:

    我已经创建了一小块函数,它可以读取 csv 文件的路径并立即返回 dict 列表,然后您可以非常轻松地遍历列表,

    def read_csv_data(path):
        """
            Reads CSV from given path and Return list of dict with Mapping
        """
        data = csv.reader(open(path))
        # Read the column names from the first line of the file
        fields = data.next()
        data_lines = []
        for row in data:
            items = dict(zip(fields, row))
            data_lines.append(items)
        return data_lines
    

    问候

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 2019-08-20
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 2012-10-01
      • 2018-05-23
      相关资源
      最近更新 更多