如何解决Python中的"ValueError: Too many values to unpack"错误?

11

我正在尝试使用我的文本文件(“out3.txt”)中的内容填充字典。

我的文本文件的格式如下:


vs,14100

mln,11491

the,7973

cts,7757

我希望我的字典answer的格式为:

answer[vs]=14100

answer[mln]=11491

我的代码是:

import os
import collections
import re
from collections import defaultdict

answer = {}
answer=collections.defaultdict(list)
with open('out3.txt', 'r+') as istream:
    for line in istream.readlines():
        k,v = line.strip().split(',')
        answer[k.strip()].append( v.strip())

但是,我收到以下错误信息:

ValueError: too many values to unpack

我该如何修复这个问题?


4
我怀疑输入文件中的某一行有超过一个逗号。请尝试运行grep ',.*,' out3.txt - Marcelo Cantos
3个回答

12
你的输入文件中有空行,我怀疑你没有分享给我们的某些行中逗号过多(因此出现“太多值无法解包”错误)。
你可以这样防止这种情况发生:
import collections

answer = collections.defaultdict(list)
with open('out3.txt', 'r+') as istream:
    for line in istream:
        line = line.strip()
        try:
            k, v = line.split(',', 1)
            answer[k.strip()].append(v.strip())
        except ValueError:
            print('Ignoring: malformed line: "{}"'.format(line))

print(answer)

注意:1传递给str.split(),会将第一个逗号之后的所有内容分配给v;如果不希望出现这种行为,而是更喜欢拒绝这些行,请删除此参数。


第一个 answer = {} 可以被移除。打开的文件应该总是被关闭。 - pepr
谢谢@pepr,当我删除其余的垃圾时,我错过了这个。 - johnsyweb

4

您的解决方案未能给出期望的输出。假设它能正常工作,您将得到 answer['vs'] = [14100],下面的代码可以实现您的意图:

import csv

with open('out3.txt') as f:
  reader = csv.reader(f, delimiter=',')
  answer = {line[0].strip():line[1].strip() for line in reader if line}

1
使用 csv 进行编程(除非输入文件非常特定且简单),加1。 - pepr

2

在这里你不需要使用collections,普通的字典就足够了:

answer = {}
with open('out3.txt', 'r+') as f:
    for line in f:
        lst = line.split(',')
        if len(lst) == 2:
            k = lst[0].strip()
            v = lst[1].strip()
            answer[k] = v

print(answer['mln'])
print(answer.get('xxx', 'not available'))

注意answer.get()类似于answer[],但您可以提供默认值。

循环中不应使用.readlines()。即使是空行也包含换行符。这样测试 if line: 就无法检测到空行。或者您必须首先去除(或rstrip)它,或者可以将行拆分为列表并测试元素的数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接