写一个字典到文本文件并读回来?

我正在尝试将字典写入一个文本文件。然后通过使用 raw_input键入键来读取 dict 值。我觉得我只是错过了一个步骤,但我已经寻找了一段时间了。

我得到了这个错误

File "name.py", line 24, in reading
print whip[name]
TypeError: string indices must be integers, not str

我的代码:

#!/usr/bin/env python
from sys import exit


class Person(object):
def __init__(self):
self.name = ""
self.address = ""
self.phone = ""
self.age = ""
self.whip = {}


def writing(self):
self.whip[p.name] = p.age, p.address, p.phone
target = open('deed.txt', 'a')
target.write(str(self.whip))
print self.whip


def reading(self):
self.whip = open('deed.txt', 'r').read()
name = raw_input("> ")
if name in self.whip:
print self.whip[name]


p = Person()


while True:
print "Type:\n\t*read to read data base\n\t*write to write to data base\n\t*exit to exit"
action = raw_input("\n> ")
if "write" in action:
p.name = raw_input("Name?\n> ")
p.phone = raw_input("Phone Number?\n> ")
p.age = raw_input("Age?\n> ")
p.address = raw_input("Address?\n>")
p.writing()
elif "read" in action:
p.reading()
elif "exit" in action:
exit(0)
327940 次浏览

要在文件中存储 Python 对象,请使用 pickle模块:

import pickle


a = {
'a': 1,
'b': 2
}


with open('file.txt', 'wb') as handle:
pickle.dump(a, handle)


with open('file.txt', 'rb') as handle:
b = pickle.loads(handle.read())


print a == b # True

请注意,我从未设置 b = a,而是将 a腌制到一个文件中,然后将其取消腌制到 b中。

至于你的错误:

self.whip = open('deed.txt', 'r').read()

self.whip是一个字典对象。deed.txt包含文本,因此当您将 deed.txt的内容加载到 self.whip中时,self.whip将成为 绳子自身的表示。

您可能希望将字符串重新计算为 Python 对象:

self.whip = eval(open('deed.txt', 'r').read())

注意 eval听起来像 evil。这是有意为之的。改用 pickle模块。

你试过 Json 模块吗? JSON 格式和 python dictionary 非常相似,而且它是人类可读/可写的:

>>> import json
>>> d = {"one":1, "two":2}
>>> json.dump(d, open("text.txt",'w'))

此代码转储为文本文件

$ cat text.txt
{"two": 2, "one": 1}

也可以从 JSON 文件加载:

>>> d2 = json.load(open("text.txt"))
>>> print d2
{u'two': 2, u'one': 1}

你的密码是 差不多了!你说得对,你只差一步。当您读入文件时,您是以字符串的形式读取它; 但是您希望将字符串返回到字典中。

您看到的错误消息是因为 self.whip是一个字符串,而不是字典。因此需要将字符串转换为字典。

例子

下面是最简单的方法: 将字符串提供给 eval():

def reading(self):
s = open('deed.txt', 'r').read()
self.whip = eval(s)

你可以用一句话来表达,但我觉得这样看起来很混乱:

def reading(self):
self.whip = eval(open('deed.txt', 'r').read())

但有时不建议使用 eval()。问题是 eval()将计算 任何字符串,如果有人欺骗您运行一个非常棘手的字符串,可能会发生不好的事情。在这种情况下,您只是在自己的文件上运行 eval(),所以应该没有问题。

但是因为 eval()是有用的,有人做了一个更安全的替代品。它被称为 literal_eval,您可以从名为 ast的 Python 模块获得它。

import ast


def reading(self):
s = open('deed.txt', 'r').read()
self.whip = ast.literal_eval(s)

ast.literal_eval()将只计算转换为基本 Python 类型的字符串,因此复杂的字符串不可能在您的计算机上做坏事。

剪辑

实际上,Python 中的最佳实践是使用 with语句来确保文件正确关闭。重写以上内容,使用 with语句:

import ast


def reading(self):
with open('deed.txt', 'r') as f:
s = f.read()
self.whip = ast.literal_eval(s)

在最流行的 Python 中,被称为“ CPython”,您通常不需要 with语句,因为内置的“垃圾收集”特性会发现您已经处理完了该文件,并为您关闭它。但是其他 Python 实现,如“ Jython”(Python for the Java VM)或“ PyPy”(一个非常酷的实验系统,具有即时代码优化)可能无法为您关闭文件。养成使用 with的习惯是件好事,我认为它使代码非常容易理解。

我创建了自己的函数,它们运行得非常好:

def writeDict(dict, filename, sep):
with open(filename, "a") as f:
for i in dict.keys():
f.write(i + " " + sep.join([str(x) for x in dict[i]]) + "\n")

它将首先存储密钥名,然后是所有值。请注意,在这种情况下,我的 dict 包含整数,所以这就是为什么它转换为 int。这是最有可能的部分,你需要改变你的情况。

def readDict(filename, sep):
with open(filename, "r") as f:
dict = {}
for line in f:
values = line.split(sep)
dict[values[0]] = {int(x) for x in values[1:len(values)]}
return(dict)

您可以循环遍历键-值对并将其写入文件

pair = {'name': name,'location': location}
with open('F:\\twitter.json', 'a') as f:
f.writelines('{}:{}'.format(k,v) for k, v in pair.items())
f.write('\n')

嗨,有一种方法可以把字典读写到文件中,你可以把你的字典转换成 JSON 格式,然后快速读写,只要这样做:

给你的约会对象:

 import json


your_dictionary = {"some_date" : "date"}
f = open('destFile.txt', 'w+')
f.write(json.dumps(your_dictionary))

以及 你的资料:

 import json


f = open('destFile.txt', 'r')
your_dictionary = json.loads(f.read())