Python - CSV读取器列表推导式

4 投票
2 回答
3494 浏览
提问于 2025-04-17 23:51

我正在尝试使用CSV读取器高效地读取文件中的列。我的代码是:

import csv
csv.register_dialect('csvrd', delimiter='\t', quoting=csv.QUOTE_NONE)


with open('myfile.txt', 'rb') as f:
    reader = csv.reader(f,'csvrd')
    a0=[x[0] for x in reader]
    a1=[x[1] for x in reader]

我能获取到第一列的值,但a1是空的。如果我先写a1,那么a0就会是空的。

我知道一个简单的解决办法,就是插入

reader=[x for x in reader]

但我只是好奇原因。当你从读取器中读取一个条目时,它会被移除吗?

这是一个示例文件myfile.txt

c11 c21 c31
c21 c22 c32

2 个回答

2

csv.reader 返回的是一个生成器。要想再次从这个生成器中读取数据,你需要重新声明它。这个 回答 详细解释了 Python 中生成器的工作原理。

8

你不能对reader进行多次循环,除非你把底层文件重新回到开始的位置。

不过,不要这样做;可以使用zip(*reader)把行转成列:

a0, a1, a2 = zip(*reader)

示例:

>>> import csv
>>> csv.register_dialect('csvrd', delimiter='\t', quoting=csv.QUOTE_NONE)
>>> data = '''\
... c11\tc21\tc31
... c21\tc22\tc32
... '''
>>> reader = csv.reader(data.splitlines(True), 'csvrd')
>>> a0, a1, a2 = zip(*reader)
>>> a0
('c11', 'c21')
>>> a1
('c21', 'c22')
>>> a2
('c31', 'c32')

撰写回答