使用** kwargs创建一个Dictionary-ValueError:字典更新序列元素#0的长度为1; 2个为必填项

时间:2018-12-12 15:57:05

标签: python-3.x dictionary valueerror

我使用以下代码创建字典,并使用按行读取的内容。

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中的内容如下: the file's content

例如

农业 = ['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

编辑:皮查姆

2 个答案:

答案 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