如何从值作为列表的文本文件中“解包”字典?我使用了在互联网上找到的以下代码:
with open("save.txt") as f:
for line in f:
( key, val) = line.split()
d[int(key)] = val
但是它给了我这个错误
ValueError: too many values to unpack (expected 2)
save.txt
pop ['7', '8', '4', '8']
funk ['9', '2', '0', '2']
pop ['7', '8', '4', '8']
funk ['9', '2', '0', '2']
stack ['9', '0', '3', '0']
答案 0 :(得分:1)
您应该将一行分成两部分,然后将第二部分转换为带有literal_eval()
的列表:
import ast
d = {}
with open("save.txt") as f:
for line in f:
key, val = line.split(' ', 1)
d[key] = ast.literal_eval(val)
由于所有三个键都是相同的,因此在您的文件中构造的字典中只有一个条目供您参考,
答案 1 :(得分:1)
您的初始代码有一些问题
您的save.txt文件很奇怪,因为如果您将此文件转换为字典,则所有keys
都是一样的,最后一个带有键test
的字典是唯一的将是迭代的最终结果。
d[int(key)] = val
,这里的预期键是一个test
的字符串,因此int(key)
是毫无意义的,将导致ValueError。
( key, val) = line.split()
您在拆分时未指定定界符,因此收到错误ValueError: too many values to unpack (expected 2)
,因为split尝试使用所有定界符,例如空格,逗号...
再次在d[int(key)] = val
这里val
仍然是字符串而不是列表
以下示例代码将根据您的要求进行操作
您的save.txt
test1 ['0', '0', '0', '0']
test2 ['0', '0', '0', '0']
test3 ['1', '0', '1', '0']
您的python代码
import ast
d = {}
with open("save.txt") as f:
for line in f:
(key, val) = line.split(maxsplit=1)
d[key] = ast.literal_eval(val)
print(d)
这是一些解释,
(key, val) = line.split(maxsplit=1)
我们只想分割第一个space
,这就是maxsplit的原因,您也可以像
(key, val) = line.split(' ', maxsplit=1)
明确表示您只想分割第一个空格。
import ast
和
d[key] = ast.literal_eval(val)
AST是一个python软件包,可用于评估文字并将其转换为列表。您可以在这里AST Documentation
了解更多信息这是我的这段代码的输出
{'test1': ['0', '0', '0', '0'], 'test2': ['0', '0', '0', '0'], 'test3': ['1', '0', '1', '0']}
答案 2 :(得分:-1)
警告:这是解决问题的一种简单快捷的方法。但是,如果不确定文件中是否包含某些危险代码,则可能很危险。
with open("save.txt") as f:
for line in f:
(key, val) = line.split(' ', 1)
d[key] = eval(val)
答案 3 :(得分:-1)
如果文件格式如下,则您提供的代码段将起作用:
key1 value1
key2 value2
key3 value3
for line in f:
将逐行浏览文件,因此line
首先包含字符串"key1 value1"
line.split()
默认在一个空格(" "
)上吐出,因此在line
上执行此操作时,它会得到一个像这样的数组:["key1", "value1"]
要使用Python的拆包,变量数量必须匹配。您收到的错误(ValueError
)解释为“要解压缩的值太多”。当您在" "
上拆分时,我怀疑您每行有多个空格,这会产生更多要解压缩的变量。
save.txt
的内容对于进一步帮助您很有帮助。
答案 4 :(得分:-1)
with open("save.txt") as f:
d = {}
for line in f:
(key, *vallist) = line.split()
d[key] = vallist
记录中的键是字符串,不能类型转换为int。