Python:在文件上编写和读取字典

时间:2014-12-21 19:21:26

标签: python file-io dictionary

我试图将字典写入.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上。

正如我所说,我希望它将字典写入文件,然后从同一文件中读取字典并再次打印。

有人能告诉我我做错了什么吗?也许举个例子说明我如何使这段代码有效?

3 个答案:

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

在此之后,dnew_d将包含相同的信息。

print(d)
print(new_d)
# {'a': 1, 'b': [0, 1, 2, 3]}
# {'a': 1, 'b': [0, 1, 2, 3]}