【问题标题】:How to read multiple values from a line in python when the # of values could changepython - 当值的数量可能发生变化时,如何从python中的一行读取多个值
【发布时间】:2015-04-09 22:43:43
【问题描述】:

我有一个 CSV 文件,我只对前 3 个值感兴趣。但是,无论谁编写了生成此 csv 文件的脚本/程序,似乎都添加了额外的值列,并且它是随机发生的。有没有办法在读取文件时忽略这些额外的值?

这是我处理这些行的sn-p代码:

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”消息。我认为这是由于额外的随机列/值。如何构造我的命令来读取整行,获取我需要的内容,并丢弃随机显示的额外内容?

【问题讨论】:

    标签: python csv python-3.x python-2.x


    【解决方案1】:

    您似乎使用的是 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 模块将行作为列表返回,在 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))  
    

    【讨论】:

    • 感谢您的快速响应。如果我将脚本部署到的服务器没有 python 3,我需要为 python2 做什么?
    【解决方案2】:

    由于您只需要前三个值,您可以这样做:

    instance, ts, data = line.rstrip().split(',')[:3]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多