当值的数量可能发生变化时,如何从 python 中的一行读取多个值
How to read multiple values from a line in python when the # of values could change
我有一个 CSV 文件,其中我只对前 3 个值感兴趣。但是,无论是谁编写了生成此 csv 文件的 script/program,似乎都添加了额外的值列,并且它是随机发生的。有没有办法在读取文件时忽略这些额外的值?
这是我处理这些行的代码片段:
for line in infile:
instance, ts, data = line.rstrip().split(',')
print ("instance = %s, date = %s, ts = %d" %(instance, ts, int(data)))
csv 文件如下所示。 foo 和 bar 我不感兴趣,它们也不会一直出现,但我觉得这让我很困惑
aaa,111111111,500
bbb,222222222,500
ccc,333333333,500,foo,bar
ddd,444444444,600,foo
eee,555555555,600
当我 运行 我的脚本时,我收到一条 "ValueError: too many values to unpack" 消息。我认为这是由于额外的随机性 columns/values。我如何构造我的命令来读取整行,获取我需要的内容,并丢弃随机显示的额外内容?
您似乎在使用Python 3、使用*运算符来收集额外的项目:
for line in infile:
instance, ts, data, *rest = line.rstrip().split(',')
print ("instance = %s, date = %s, ts = %d" %(instance, date, ts))
同时考虑使用 csv 模块来处理 csv 文件。类似于 str.split
csv 模块将 return 行作为列表,在 Python 2 中你为此使用切片:
import csv
with open(filename) as infile:
for row in csv.reader(infile):
instance, ts, data = row[:3]
# or if row can have even less than 3 items
# instance, ts, data = row[:3] + [None]*(3 - len(row))
由于您只需要前三个值,您可以这样做:
instance, ts, data = line.rstrip().split(',')[:3]
我有一个 CSV 文件,其中我只对前 3 个值感兴趣。但是,无论是谁编写了生成此 csv 文件的 script/program,似乎都添加了额外的值列,并且它是随机发生的。有没有办法在读取文件时忽略这些额外的值?
这是我处理这些行的代码片段:
for line in infile:
instance, ts, data = line.rstrip().split(',')
print ("instance = %s, date = %s, ts = %d" %(instance, ts, int(data)))
csv 文件如下所示。 foo 和 bar 我不感兴趣,它们也不会一直出现,但我觉得这让我很困惑
aaa,111111111,500
bbb,222222222,500
ccc,333333333,500,foo,bar
ddd,444444444,600,foo
eee,555555555,600
当我 运行 我的脚本时,我收到一条 "ValueError: too many values to unpack" 消息。我认为这是由于额外的随机性 columns/values。我如何构造我的命令来读取整行,获取我需要的内容,并丢弃随机显示的额外内容?
您似乎在使用Python 3、使用*运算符来收集额外的项目:
for line in infile:
instance, ts, data, *rest = line.rstrip().split(',')
print ("instance = %s, date = %s, ts = %d" %(instance, date, ts))
同时考虑使用 csv 模块来处理 csv 文件。类似于 str.split
csv 模块将 return 行作为列表,在 Python 2 中你为此使用切片:
import csv
with open(filename) as infile:
for row in csv.reader(infile):
instance, ts, data = row[:3]
# or if row can have even less than 3 items
# instance, ts, data = row[:3] + [None]*(3 - len(row))
由于您只需要前三个值,您可以这样做:
instance, ts, data = line.rstrip().split(',')[:3]