该程序的整个想法是从文本文件中读取数据(使用' 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>
根据我在此错误中发现的内容,它不接受特定范围之外的任何值类型,但应该接受我的。 我迷路了,我已经搜索过几十个相关的帖子,但无法找到解决方法。
答案 0 :(得分:2)
你有一个字典:
{'Name': '00000000'}
当你把它写出来时:
for item in contactlist:
f.write(item + contactlist[item])
您的文件是:
Name00000000
你无法用ast.literal_eval
解析它 - 它不再是&#34;看起来像&#34;一本Python字典。相反,写出整个字典的字符串表示形式:
f.write(str(contactlist))
然后您的文件内容实际上看起来像字典:
{'Name': '00000000'}
你可以将它评估回字典。
或者,查看例如pickle
,可以创建任意Python数据结构的平面文件表示,或json
,可以处理例如整数,字符串和浮点数的列表和字典。