在具有列表值的文件中读取字典

时间:2018-09-14 01:19:54

标签: python dictionary

如何从值作为列表的文本文件中“解包”字典?我使用了在互联网上找到的以下代码:

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']

5 个答案:

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

您的初始代码有一些问题

  1. 您的save.txt文件很奇怪,因为如果您将此文件转换为字典,则所有keys都是一样的,最后一个带有键test的字典是唯一的将是迭代的最终结果。

  2. d[int(key)] = val,这里的预期键是一个test的字符串,因此int(key)是毫无意义的,将导致ValueError。

  3. ( key, val) = line.split()您在拆分时未指定定界符,因此收到错误ValueError: too many values to unpack (expected 2),因为split尝试使用所有定界符,例如空格,逗号...

  4. 再次在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 astd[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。