我试图将字典写入.txt文件,然后再次从该文件中读取它。
这是我到目前为止所得到的:
book = {'key1':'1','key2':'2'}
pfile = open("testfile.txt", "w+")
pfile.write("%s" % book)
pfile.close()
k1 = book['key1']
k2 = book['key2']
print(k1)
print(k2)
rfile = open("testfile.txt", "r")
rbook = rfile.read()
k1 = rbook['key1']
k2 = rbook['key2']
print(k1)
print(k2)
但是当我尝试运行.py时它会返回:
1
2
Traceback (most recent call last): File "sotest.py", line 16, in <module>
k1b = rbook['key1']
TypeError: string indices must be integers, not str
顺便说一句,我在Mac上。
正如我所说,我希望它将字典写入文件,然后从同一文件中读取字典并再次打印。
有人能告诉我我做错了什么吗?也许举个例子说明我如何使这段代码有效?
答案 0 :(得分:1)
当您从文件中读取字典时,结果为string
,您无法继续作为字典!您可以使用ast.literal_eval
将其转换为字典:
>>> ast.literal_eval("{'key1':'1','key2':'2'}")
{'key2': '2', 'key1': '1'}
但作为一种更有效的方式,您可以使用shelf
模块:
“架子”是一个持久的,类似字典的对象。与“dbm”数据库的区别在于,架子中的值(而不是键!)可以是基本上任意的Python对象 - pickle模块可以处理的任何东西。这包括大多数类实例,递归数据类型和包含许多共享子对象的对象。键是普通的字符串。
答案 1 :(得分:0)
你可以使用the pickle library所以你写(例如):
import pickle
pfile = open('filename.txt','wb')#binary mode for using pickle
pickle.dump(mydict, pfile)
pfile.close()
或者即使你想做更多'pythonic':
import pickle
with open('filename.txt','wb') as pfile:
pickle.dump(mydict,pfile)
答案 2 :(得分:0)
使用pickle
可能存在安全问题,因此可以在加载pickle时运行Python代码。如果恶意用户使用某些恶意代码替换了您的pickle文件,那么您就会遇到麻烦。
我建议使用Javascript Object Notation或JSON将字典写入文件。 Python有一个内置的json
模块,可以提供加载和转储数据。下面的代码是一个玩具示例,它用字典来完成。
import json
d = {'a':1, 'b':[0,1,2,3]}
# j is now a string containing the data from d in the json format.
j = json.dumps(d)
with open('my_data.json', 'w') as f:
f.write(j)
现在,您将拥有一个包含数据的文件my_data.json
。如果您希望稍后重新阅读,可以使用以下代码:
with open('my_data.json', 'r') as f:
new_d = json.loads(f.read())
在此之后,d
和new_d
将包含相同的信息。
print(d)
print(new_d)
# {'a': 1, 'b': [0, 1, 2, 3]}
# {'a': 1, 'b': [0, 1, 2, 3]}