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:解包的值太多

我怎样才能解决这个问题?

4

3 回答 3

12

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

您可以防止这种情况,如下所示:

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)

注意:通过传入1str.split()第一个逗号之后的所有内容都将分配给v; 如果这不是所需的行为并且您希望这些行被拒绝,您可以删除此参数。

于 2013-07-01T11:33:16.223 回答
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}
于 2013-07-01T11:36:17.587 回答
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)它,或者您可以将行拆分到列表并测试元素的数量。

于 2013-07-01T11:59:17.143 回答