只打包CSV阅读器的前几列?

时间:2014-07-09 16:24:08

标签: python csv iterable-unpacking

阅读CSV文件时:

with open("foo.csv") as foo:
    for (a,b) in csv.reader(foo):
        ....

我收到错误

ValueError: too many values to unpack

当文件包含两列以上时。

有没有办法解开前两列并忽略其余列?

我想我能做到

with open("foo.csv") as foo:
    for row in csv.reader(foo):
        a,b = row[0:2]
        ....

但这看起来很难看。

PS。我正在使用python2,如果这很重要。

3 个答案:

答案 0 :(得分:1)

在python2中似乎没有任何机制来限制csv.reader返回的列数。我检查了cpython 27 -> csv.Reader_iternext()的来源,结束行阅读的唯一可能性(我只花了一些时间分析代码)就是遇到一个字符:\r\n\0

您也可以使用DictReader

  

如果读取的行包含的字段多于fieldnames序列,则   剩余数据将添加为由restkey的值键入的序列。   如果行读取的字段少于fieldnames序列,则   其余键取可选restval参数的值。

所以你可以这样做:

with open("foo.csv") as foo:
    for row in csv.DictReader(csvfile=foo, fieldnames=('a', 'b')):
        a = row['a']
        b = row['b']
        ....

但我个人会检查行的长度并使用(a,b) = row[:2]

答案 1 :(得分:1)

在python3中你应该能够这样做:

with open("foo.csv") as foo:
    for row in csv.reader(foo):
        a,b,*unused = row

但是既然你使用python2,如果你确保每行至少有3列你可以这样做:

with open("foo.csv") as foo:
    for line in foo:
        a,b,*unused = line.split(',', 3)
        # splits every line by separator ','
        # but stops splitting after the first two   (maxsplit) 

或者您可以使用pandas,就像那样:

import pandas

dataframe = pandas.read_csv("foo.csv", usecols=[0,1])

答案 2 :(得分:1)

使用发电机:

with open("foo.csv") as foo:
    for a,b in (r[0:2] for r in csv.reader(foo)):
         ...

这更清楚地显示了您的意图。它基本上等同于你的丑陋"这样做的方式,但它更容易看。

相关问题