我如何修复ValueError:在Python中解压缩的值太多了?

时间:2013-07-01 11:27:07

标签: python python-3.x

我正在尝试使用我的文本文件(“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:要解压缩的值太多

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:12)

您的输入文件中有空line个,我怀疑您未与我们共享的line中有一个逗号太多(因此“解压缩的值太多”) )。

你可以防范这种情况,如下:

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;如果这不是所希望的行为,并且您希望拒绝这些行,则可以删除此参数。

答案 1 :(得分: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}

答案 2 :(得分: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)它,或者您可以将该行拆分为列表并测试元素的数量。