Python 使用literal\u eval将字符串转换为字典

Python 使用literal\u eval将字符串转换为字典,python,string,dictionary,Python,String,Dictionary,该程序的全部思想是从文本文件(使用“for”循环将其保存为字典中的字符串)中读取数据,然后将该内容插入字典中。 之后,程序继续请求输入(姓名和号码),并将其添加到字典中 我使用“ast.literal\u eval”将字符串转换为字典,如下所示: import ast f = open("resources/contacts.txt", "r+") contactlist = f.read() # converting the string into a dictionary starts h

该程序的全部思想是从文本文件(使用“for”循环将其保存为字典中的字符串)中读取数据,然后将该内容插入字典中。 之后,程序继续请求输入(姓名和号码),并将其添加到字典中

我使用“ast.literal\u 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>
回溯(最近一次呼叫最后一次):
文件“D:\Code\Python\Projects\Contacts.py”,第5行,在
contactlist=ast.literal\u eval(contactlist)
文件“D:\Code\Python\Python\lib\ast.py”,第84行,文本值
返回\u转换(节点\u或字符串)
文件“D:\Code\Python\Python\lib\ast.py”,第83行,在转换中
raise VALUERROR('格式错误的节点或字符串:'+repr(节点))
ValueError:节点或字符串格式不正确:
从我在这个错误中发现的情况来看,它不接受特定范围之外的任何值类型,但我的值类型应该被接受。
我迷路了,我已经搜索了几十个相关的线程,但找不到修复程序。

您有一本类似以下内容的词典:

{'Name': '00000000'}
当你写出来的时候:

for item in contactlist:
    f.write(item + contactlist[item])
您的文件是:

Name00000000
您无法使用
ast.literal\u eval
解析它-它不再“看起来”像Python字典。相反,写出整个词典的字符串表示形式:

{'Name': '00000000'}
那么文件的内容实际上看起来就像一本字典:

{'Name': '00000000'}
你可以用字典来评估它


或者,研究一下,例如,哪个可以创建任意Python数据结构的平面文件表示,或者,哪个可以处理整数、字符串和浮点的列表和字典。

打印(联系人列表)给你什么?@jornsharpe如果我删除第4行,它打印:name00000000那么您希望如何解释它呢?!这不是字典的字符串表示法@我不知道。。这是我能找到的唯一一种方法,它应该能满足我的需要,我可能已经偏离了标准。我想我应该重新表述我的问题,字典的字符串表示形式是什么样子的?这很有意义,我多次忽略了它。我非常感谢你的帮助。