【问题标题】:CSV Reader not enough values to unpack (expected 11, got 1)CSV 阅读器没有足够的值来解压(预期 11,得到 1)
【发布时间】:2018-11-08 08:45:32
【问题描述】:

我在使用 csv 阅读器时遇到了问题。 我想逐行读取 csv 文件并打印出每行的第二个条目。 一行的所有条目都写在一个单元格末尾,以','分隔

看起来像这样: 0.00,457.00,0.00,862.00,12892,32575,"LAX",11292,30325,"DEN",11,

我试过这段代码:

    with open(file_path, 'r', newline='') as file:
        reader = csv.reader(file, delimiter=',')
        for line in reader:
            passangers, freight, mail, distance, origin_airport_id, origin_city_marked_id, origin, dest_airport_id, dest_city_marked_id, dest, month = line
            print(freight)

但我得到:ValueError: no enough values to unpack (expected 11, got 1)

这段代码前段时间在另一个项目中为我工作过,所以我真的不知道为什么它现在不起作用。我尝试了不同的分隔符( ' ; ' ,空格等),但这基本上是一个猜测,因为我不知道还能做什么

【问题讨论】:

  • 如果你print(line)返回什么?
  • 为什么不试试熊猫呢? import pandas as pd, df = pd.read_csv(file_path), df['freight']。最后一行假设你的 csv 有一个标题行
  • 如果我在乘客之前打印(行),...我得到的行:[0.00,457.00,0.00,862.00,12892,32575,"LAX",11292,30325,"DEN", 11,]

标签: python csv


【解决方案1】:

我强烈建议您使用csv.DictReader 来构建您的逻辑。像这里一样命名如此大量的变量可能会导致混淆。

这是一个示例,我们为 fieldnames 参数提供了一个列表。请注意,有 12 个字段,因为您的行以逗号结尾。因为field_list 只有11 个元素,所以最后一列被分配了键None。这在您打印字典时很明显。

from io import StringIO
import csv

mystr = StringIO('0.00,457.00,0.00,862.00,12892,32575,"LAX",11292,30325,"DEN",11,')

field_list = ['passengers', 'freight', 'mail', 'distance', 'origin_airport_id',
              'origin_city_marked_id', 'origin', 'dest_airport_id',
              'dest_city_marked_id', 'dest', 'month']

# replace mystr with open(file_path, 'r', newline='')
with mystr as file:
    reader = csv.DictReader(file, delimiter=',', fieldnames=field_list)
    for line in reader:
        print(line)

OrderedDict([('passengers', '0.00'),
             ('freight', '457.00'),
             ('mail', '0.00'),
             ('distance', '862.00'),
             ('origin_airport_id', '12892'),
             ('origin_city_marked_id', '32575'),
             ('origin', 'LAX'),
             ('dest_airport_id', '11292'),
             ('dest_city_marked_id', '30325'),
             ('dest', 'DEN'),
             ('month', '11'),
             (None, [''])])

【讨论】:

    【解决方案2】:

    问题是由于您尝试将具有 12 个元素的列表压缩为 11 个元素。

    试试:

        passangers, freight, mail, distance, origin_airport_id, origin_city_marked_id, origin, dest_airport_id, dest_city_marked_id, dest, month, element = line
    

    原问题的简化示例:

    $ cat list.py 
    line = ['a','b','c']
    a,b = line
    
    $ python list.py 
    Traceback (most recent call last):
      File "list.py", line 2, in <module>
        a,b = line
    ValueError: too many values to unpack (expected 2)
    

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2018-08-14
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多