阅读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,如果这很重要。
答案 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)):
...
这更清楚地显示了您的意图。它基本上等同于你的丑陋"这样做的方式,但它更容易看。