我正在尝试使用我的文本文件(“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:要解压缩的值太多
我该如何解决这个问题?
答案 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
)它,或者您可以将该行拆分为列表并测试元素的数量。