我正在尝试将字典写入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)
答案 0 :(得分:149)
你试过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}
答案 1 :(得分:73)
您的代码几乎正确!你是对的,你只是错过了一步。当你读入文件时,你正在读它作为一个字符串;但是你想把字符串变回字典。
您看到的错误消息是因为self.whip
是字符串,而不是字典。
我首先写道,您可以将字符串输入dict()
,但这不起作用!你需要做点别的事。
以下是最简单的方法:将字符串输入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”(Java VM的Python)或“PyPy”(一个非常酷的实验系统,具有即时代码优化)可能无法为您关闭文件。养成使用with
的习惯是好的,我认为它使代码很容易理解。
答案 2 :(得分:63)
要将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
模块。
答案 3 :(得分:8)
我创建了自己的功能,非常好用:
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)
答案 4 :(得分:5)
您可以遍历键值对并将其写入文件
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')
答案 5 :(得分:4)
您好,有一种方法可以编写和读取字典文件,您可以将字典转换为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())