写一个字典到txt文件并读回来?
我正在试图写一个字典到一个txt文件。 然后通过用raw_input
input密钥来读取字典值。 我觉得我只是失去了一步,但我一直在寻找一段时间。
我得到这个错误
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.txt
到self.whip
, self.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())