使用literal_eval将字符串转换为字典

1 投票
1 回答
1907 浏览
提问于 2025-04-18 08:24

这个程序的主要目的是从一个文本文件中读取数据(这个数据是通过一个'for'循环从字典中保存为字符串的),然后把这些内容再放回字典里。接下来,程序会继续询问用户输入(名字和号码),并把这些信息添加到字典中。

我使用了“ast.literal_eval”来把字符串转换成字典,像这样:

import ast

f = open("resources/contacts.txt", "r+")
contactlist = f.read() # converting the string into a dictionary starts here
contactlist = ast.literal_eval(contactlist) # and ends here
print(contactlist) # for debugging purposes 

answer = 'again'

while answer == 'again':
    contact = input("enter a contact name: ")
    contactnum = input("enter the contact's number: ")
    contactlist[contact]= contactnum
    answer = input("again or stop: ")

f = open("resources/contacts.txt", "r+")

for item in contactlist:
    f.write(item + contactlist[item])

print(f.read())
f.close()

但是这段代码出现了错误:

Traceback (most recent call last):
  File "D:\Code\Python\Projects\Contacts.py", line 5, in <module>
    contactlist = ast.literal_eval(contactlist)
  File "D:\Code\Python\PYTHON\lib\ast.py", line 84, in literal_eval
    return _convert(node_or_string)
  File "D:\Code\Python\PYTHON\lib\ast.py", line 83, in _convert
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Name object at 0x02F52B10>

根据我找到的信息,这个错误是因为它不接受特定范围以外的值类型,但我的值应该是可以接受的。我感到很困惑,已经查阅了很多相关的讨论,但还是找不到解决办法。

1 个回答

3

你有一个字典,像这样:

{'Name': '00000000'}

当你把它写出来的时候:

for item in contactlist:
    f.write(item + contactlist[item])

你的文件内容是:

Name00000000

不能ast.literal_eval 来解析这个内容,因为它看起来不再像一个Python字典了。相反,你应该写出整个字典的字符串表示:

f.write(str(contactlist))

这样,你的文件内容实际上就看起来像一个字典:

{'Name': '00000000'}

然后你就可以把它再转回字典了。

另外,你也可以看看比如 pickle,它可以创建任意Python数据结构的简单文件表示,或者 json,它可以处理像整数、字符串和浮点数的列表和字典。

撰写回答