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

我正在试图写一个字典到一个txt文件。 然后通过用raw_inputinput密钥来读取字典值。 我觉得我只是失去了一步,但我一直在寻找一段时间。

我得到这个错误

 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) 

你的代码几乎正确的 ! 你是对的,你只是失去了一步。 当你读入文件时,你正在读取它作为一个string; 但是你想把string变成字典。

你看到的错误信息是因为self.whip是一个string,而不是字典。

我第一次写道,你可以只将string喂给dict()但这不行! 你需要做别的事情。

这是最简单的方法:将stringinput到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()会评估任何string,如果有人欺骗你运行一个非常棘手的string,可能会发生一些不好的事情。 在这种情况下,你只是在你自己的文件上运行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()只会计算转换成基本Pythontypes的string,所以不会有麻烦的string在你的计算机上做坏事。

编辑

实际上,Python中的最佳做法是使用with语句来确保文件正确closures。 重写上面的使用with语句:

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

在最stream行的Python中,称为“CPython”,通常不需要with语句,因为内置的“垃圾回收”function会发现你已经完成了这个文件,并且会为你closures它。 但是其他的Python实现,例如“Jython”(Java VM的Python)或“PyPy”(一个非常酷的实时系统,具有即时代码优化)可能不会为你closures文件。 习惯使用这个习惯是很好的,我认为这使得代码很容易理解。

你有没有试过json模块 ? JSON格式与Python字典非常相似。 它是人类可读/可写的:

 >>> 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} 

要将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的内容deed.txtself.whipself.whip就成为它自己的string表示。

您可能想要将string评估回Python对象:

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

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

我创build了自己的function,非常好用:

 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") 

它将首先存储键名,然后是所有值。 请注意,在这种情况下,我的字典包含整数,所以这就是为什么它转换为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格式,快速读写,只要这样做:

写你的date:

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

并阅读您的数据:

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