首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字典写入txt文件并将其读回?

将字典写入txt文件并将其读回?
EN

Stack Overflow用户
提问于 2012-06-14 13:07:15
回答 6查看 310K关注 0票数 127

我正在尝试将字典写到txt文件中。然后通过使用raw_input键入密钥来读取dict值。我觉得我只是错过了一步,但我已经寻找了一段时间。

我得到了这个错误

代码语言:javascript
复制
File "name.py", line 24, in reading
    print whip[name]
TypeError: string indices must be integers, not str

我的代码:

代码语言:javascript
复制
#!/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)
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-06-14 13:20:12

你的代码几乎是正确的!你说得对,你只是少走了一步。当您读取文件时,您将其作为字符串读取;但是您希望将该字符串转换回字典中。

您看到的错误消息是因为self.whip是一个字符串,而不是字典。因此,您需要将字符串转换为字典。

示例

下面是最简单的方法:将字符串输入到eval()。如下所示:

代码语言:javascript
复制
def reading(self):
    s = open('deed.txt', 'r').read()
    self.whip = eval(s)

你可以用一行代码来完成它,但是我认为这样看起来很混乱:

代码语言:javascript
复制
def reading(self):
    self.whip = eval(open('deed.txt', 'r').read())

但有时不推荐使用eval()。问题是eval()将计算任何字符串,如果有人欺骗您运行一个非常棘手的字符串,可能会发生一些不好的事情。在本例中,您只是在自己的文件上运行eval(),所以应该没问题。

但因为eval()是有用的,所以有人提出了一种更安全的替代方案。这就是Python,您可以从一个名为astliteral_eval模块中获取它。

代码语言:javascript
复制
import ast

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

ast.literal_eval()只会计算变成基本Python类型的字符串,所以一个棘手的字符串不可能在您的计算机上做一些不好的事情。

编辑

实际上,Python语言中的最佳实践是使用with语句来确保文件正确关闭。重写以上代码以使用with语句:

代码语言:javascript
复制
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的习惯很好,我认为这会让代码变得非常容易理解。

票数 105
EN

Stack Overflow用户

发布于 2012-06-14 13:14:28

你试过the json module吗?JSON格式非常类似于python字典。而且它是人类可读/可写的:

代码语言:javascript
复制
>>> import json
>>> d = {"one":1, "two":2}
>>> json.dump(d, open("text.txt",'w'))

此代码转储为文本文件

代码语言:javascript
复制
$ cat text.txt 
{"two": 2, "one": 1}

您也可以从JSON文件加载:

代码语言:javascript
复制
>>> d2 = json.load(open("text.txt"))
>>> print d2
{u'two': 2, u'one': 1}
票数 182
EN

Stack Overflow用户

发布于 2012-06-14 13:14:10

要将Python对象存储在文件中,请使用pickle模块:

代码语言:javascript
复制
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中。

至于你的错误:

代码语言:javascript
复制
self.whip = open('deed.txt', 'r').read()

self.whip是一个字典对象。deed.txt包含文本,因此当您将deed.txt的内容加载到self.whip中时,self.whip将成为其自身的字符串表示形式。

您可能希望将字符串重新计算为Python对象:

代码语言:javascript
复制
self.whip = eval(open('deed.txt', 'r').read())

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

票数 73
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11026959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档