我使用以下代码创建字典,并使用按行读取的内容。
with open(file='ipc_reference.txt', mode='r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines[:]:
line = line.replace('\n', '')
print(line)
line_dic = dict(line)
ipc_reference.txt中的内容如下:
例如
农业 = ['A01C1','C12N15/90']
林业 = ['A01C1','A01H1']
但是它会抛出这样的错误:
Traceback (most recent call last):
File "E:/projects/ipc_industry/reference_and_count.py", line 10, in <module>
line_dic = dict(line)
ValueError: dictionary update sequence element #0 has length 1; 2 is required
因此,我尝试像这样直接使用变量“ line”的内容(因为括号中的内容太长,我在这里只显示两个。实际上,我在Pycharm中运行了长版本。):
D3 = dict(农业 = ['A01C1','C12N15/90'],林业 = ['A01C1','A01H1'])
print(D3)
那是正确的!执行的结果是:
{'农业': ['A01C1', 'C12N15/90'], '林业': ['A01C1', 'A01H1']}
那为什么ValueError:dictionary更新序列元素#0的长度为1;为什么? 2是必需发生的吗?如何解决该问题?
系统:Windows 10
版本:Python 3.6
编辑:皮查姆
答案 0 :(得分:0)
这是因为line
是 str
。解决此问题的一种方法是使用exec()
。将字符串作为Python命令执行。
formatted = f'D3 = dict({line})'
exec(formatted)
print(D3)
输出,其中line
= '农业 = ['A01C1','C12N15/90']'
:
{'农业': ['A01C1', 'C12N15/90']}
答案 1 :(得分:0)
文件的内容不会被视为Python源代码,而是字符串。 dict
构造函数在获得不是映射的可迭代对象时,会将其视为(key, value)
对的可迭代对象。字符串是逐个字符地迭代的,但是dict
构造函数无法将各个字符分解成key, value
对,因此失败。
我们应该做的是在=
上拆分每一行,将右侧作为列表文字求值,然后更新正在运行的字典:
from ast import literal_eval
with open(file='ipc_reference.txt', mode='r', encoding='utf-8') as f:
d = {}
for line in f:
key, value = line.split(" = ", 1) # This assumes the key cannot contain ' = '
value = literal_eval(value)
d[key] = value