【问题标题】:Python - CSV Reader List ComprehensionPython - CSV阅读器列表理解
【发布时间】:2014-05-03 18:34:05
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • [x for x in reader] 可以写成list(reader)。尽管如此,显式的for 循环可能会更好:您只对 CSV 文件进行一次迭代,然后在您的代码尝试执行两次时毫无问题地做任何您想做的事情。可以在列表推导中编写相同的内容,但推导并不总是更干净/pythonic。

标签: python list csv list-comprehension


【解决方案1】:

您不能多次循环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')

【讨论】:

    【解决方案2】:

    csv.reader 返回一个生成器。为了再次从生成器中读取,您必须重新声明它。这个answer 详细解释了 Python 的生成器是如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2013-02-28
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      相关资源
      最近更新 更多