【问题标题】:Python3 CSV reader ValueErrorPython3 CSV 阅读器 ValueError
【发布时间】:2014-06-12 17:50:47
【问题描述】:

我搜索了 python csv 问题,似乎找不到任何解决我遇到的阅读器错误的内容。

我有一个包含 6 列的 csv 文件,试图访问其中的两个:

import csv

with open('/home/conjugater/Downloads/aapl.csv', newline='') as csvfile:
  dialect=csv.Sniffer().sniff(csvfile.read(1024))
  csvfile.seek(0)
  reader=csv.reader(csvfile, dialect)
  for row in reader:
      for Date, Open, High, Low, Close, Volume in row:
          print(Date, Close)

我还没有完成编码,但这是我第一次使用 csv 模块,我只是想感受一下它(总体上对 python 来说相对较新)。

Traceback (most recent call last):
File "reader.py", line 8, in <module>
for Date, Open, High, Low, Close, Volume in row:
ValueError: need more than 5 values to unpack

我可以得到我想要的列

for row in reader:
    print(row[0], row[4])

但我知道有一种方法也可以使用 python 为每列分配一个名称;非常感谢任何帮助。

【问题讨论】:

  • 您的文件似乎只有 5 列。
  • @dano print(len(row)) 每行返回 6

标签: python csv python-3.x


【解决方案1】:

当您只需要一个时,您有 2 个 for 循环:

for (Date, Open, High, Low, Close, Volume) in reader:
    print(Date, Close)

【讨论】:

  • 我想他可能想要for (Date, Open, High, Low, Close, Volume) in reader:。但是,是的,这是他的问题。
  • 是的,对 python (和一般编程)来说有点新,但还没有我想要的效率。感谢您指出这一点,我正在尝试开发有效的编码实践
  • @bushc 不确定您是否意识到这一点,但这是您的错误的实际原因。像您一样执行for Date, Open, High, Low, Close, Volume in row: 实际上是一次遍历row 元组中的六个元素中的每一个。
  • @dano 会减慢速度吗?不知道我明白为什么这是一件坏事?
  • @bushc 这意味着你现在正在这样做:for Date, Open, High, Low, Close, Volume in ("6/12/15", "20.00", "21.00", "19.00", "20.58", "20"):不是你真正想要做的。这将遍历元组,获取每个元素,并尝试将其解包到Date, Open, High, Low, Close, Volume。所以首先它会尝试解压"6/12/2014",这当然会失败,并导致你看到的ValueError
【解决方案2】:

你为什么要分配newline=''?这告诉open() 将每个空字符串视为一行的结尾。试试这个:newline='\n'。或者在不通过newline 的情况下尝试。

Vor 下面的评论也很有用。 See docsopen 了解更多信息。

【讨论】:

【解决方案3】:

你很接近,但你需要使用

with open('/home/conjugater/Downloads/aapl.csv', newline='') as csvfile:
  dialect=csv.Sniffer().sniff(csvfile.read(1024))
  csvfile.seek(0)
  reader=csv.DictReader(csvfile, dialect, fieldnames = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume'])
  for row in reader:
      for Date, Open, High, Low, Close, Volume in row:
          print("{}: {}".format(Date, Close))

希望对您有所帮助....

【讨论】:

  • 谢谢,我会在尝试 @dano 的修复后检查一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多