将字典写入 txt 文件并将其读回?[重复]
- 2025-03-04 08:27:00
- admin 原创
- 75
问题描述:
我正在尝试将字典写入 txt 文件。然后通过使用 键入键来读取字典值raw_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:
*read to read data base
*write to write to data base
*exit to exit"
action = raw_input("
> ")
if "write" in action:
p.name = raw_input("Name?
> ")
p.phone = raw_input("Phone Number?
> ")
p.age = raw_input("Age?
> ")
p.address = raw_input("Address?
>")
p.writing()
elif "read" in action:
p.reading()
elif "exit" in action:
exit(0)
解决方案 1:
你尝试过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}
解决方案 2:
你的代码几乎是正确的!你是对的,你只是缺少一步。当你读入文件时,你将其作为字符串读取;但你想将字符串重新转换为字典。
您看到的错误消息是因为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
,你可以从名为 的 Python 模块中获取它ast
。
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
,我认为它使代码非常容易理解。
解决方案 3:
要将 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
模块 。
解决方案 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())
解决方案 5:
我创建了自己的函数,效果非常好:
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]]) + "
")
它将首先存储键名,然后存储所有值。请注意,在这种情况下,我的字典包含整数,因此它会转换为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)
解决方案 6:
您可以遍历键值对并将其写入文件
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('
')
解决方案 7:
我不想导入 json 或 pickle - 我不确定为什么,但上述或其他答案对我都不起作用。我终于写了这个,它有效。似乎保存和打开一个字典比这更容易。
with open(fname, 'w') as f:
for i in dic.keys():
f.write(i + ":" + str(dic[i])+'
')
mydict = {}
with open(fname, mode='r') as f2:
for line in f2:
s = line.split(':')
mydict[s[0]] = s[1].split('
')[0]
print(mydict)
扫码咨询,免费领取项目管理大礼包!