16

我是 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
4

2 回答 2

38

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

fh.seek(0)

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

next(fh)

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

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

data = list(read)

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

于 2012-06-22T04:27:51.253 回答
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

问候

于 2012-06-22T05:04:03.943 回答