把一个小块写到txt文件并把它读回来?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

我正试图将字典写到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:\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)
提问于
用户回答回答于

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

你看到的错误信息是因为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从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”(用于JavaVM的Python)或“PyPy”(一个非常酷的实验系统,具有实时代码优化)可能无法找到关闭文件的方法。养成习惯使用with,我认为这使得代码很容易理解。

用户回答回答于

你试过吗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}

扫码关注云+社区