当值的数量可能发生变化时,如何从 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]