我正在尝试将字典写到txt文件中。然后通过使用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)发布于 2012-06-14 13:20:12
你的代码几乎是正确的!你说得对,你只是少走了一步。当您读取文件时,您将其作为字符串读取;但是您希望将该字符串转换回字典中。
您看到的错误消息是因为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()是有用的,所以有人提出了一种更安全的替代方案。这就是Python,您可以从一个名为ast的literal_eval模块中获取它。
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“(用于Java的Python)或"PyPy”(具有实时代码优化的非常酷的实验系统)可能无法为您关闭文件。养成使用with的习惯很好,我认为这会让代码变得非常容易理解。
发布于 2012-06-14 13:14:28
你试过the json module吗?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}发布于 2012-06-14 13:14:10
要将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模块。
https://stackoverflow.com/questions/11026959
复制相似问题