将字典写入文本文件并读取回来?

14 浏览
0 Comments

将字典写入文本文件并读取回来?

我正在尝试将一个字典写入到txt文件中,然后通过使用raw_input输入键来读取字典的值。我感觉我只是缺了一步,但我已经找了一段时间了。\n我得到了这个错误:\nFile \"name.py\", line 24, in reading\n print whip[name]\nTypeError: string indices must be integers, not str\n\n我的代码:\n

#!/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
0 Comments

问题的出现的原因是作者想要将Python对象存储到文件中,并从文件中读取回来。在代码中,作者尝试使用pickle模块来实现这一目的。

解决方法是使用pickle模块来存储和读取Python对象。在代码中,作者首先将字典对象a使用pickle.dump()方法存储到文件'file.txt'中,然后使用pickle.loads()方法将文件'file.txt'中的内容读取出来并赋值给变量b。

另外,文章中还提到了另一种错误的解决方法。在代码中,作者尝试使用eval()函数将文件'deed.txt'中的内容转化为Python对象并赋值给变量self.whip。然而,这种方法是不推荐的,因为eval()函数具有潜在的安全风险。文章中建议使用pickle模块来代替eval()函数。

最后,文章中还提到了一个与问题无关的评论,讨论了使用pickle模块存储可编辑的配置文件的问题。

总结起来,问题的原因是作者想要将Python对象存储到文件中并从文件中读取回来。解决方法是使用pickle模块来实现这一目的。另外,还有使用eval()函数的错误解决方法和存储可编辑配置文件的讨论。

0
0 Comments

问题:如何将字典写入txt文件并读取回来?

有一个代码,几乎是正确的。但是缺少了一步。读取文件时,读取的是一个字符串,但是需要将字符串转换回字典。错误信息是因为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()函数会评估任何字符串,如果有人在字符串中 trick 你运行一个复杂的字符串,可能会发生一些问题。在这种情况下,你只是在自己的文件上运行eval(),所以应该没问题。

但是因为eval()函数很有用,有人为其提供了一个更安全的替代方法。这个替代方法叫做literal_eval,可以从Python的ast模块中导入。

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

literal_eval()函数只会评估能够转换为基本Python类型的字符串,所以没有办法让一个复杂的字符串在你的计算机上产生坏的影响。

实际上,在Python中,最佳实践是使用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语句的习惯是好的,而且我认为这样的代码也很容易理解。

dict()函数期望的是一个字典或元组列表。它不会评估字符串。

感谢提醒,我会编辑回答。

问题:

尝试先运行一下;)

谢谢你的回答。你能给一个使用eval()函数危险的“tricky”字符串的例子吗?

我做了一个快速搜索,找到了一个StackOverflow的答案,其中给出了例子。这些例子展示了如何通过正确构造的字符串运行任意命令(使用用户权限)。此外,这些字符串还可以覆盖任何用户有写入权限的文件,从而打开各种权限提升攻击的可能性。

0
0 Comments

问题的原因是在将字典写入文本文件并从中读取时,使用的方法可能存在一些问题。一种常见的方法是使用json模块进行读写操作,因为JSON格式与Python字典非常相似,并且易于阅读和写入。但是,这种方法在处理一些复杂的字典时可能会出现问题,比如具有嵌套集合值的情况。因此,推荐使用pickle方法来解决这个问题。

解决方法是使用pickle模块来代替json模块进行字典的读写操作。Pickle模块可以序列化Python对象并将其保存到文件中,然后再从文件中反序列化读取对象。

以下是使用pickle模块进行字典读写的示例代码:

import pickle
# 写入字典到文件
d = {"one":1, "two":2}
with open("text.txt", 'wb') as file:
    pickle.dump(d, file)
# 从文件中读取字典
with open("text.txt", 'rb') as file:
    d2 = pickle.load(file)
print(d2)  # 输出: {'one': 1, 'two': 2}

使用pickle模块的好处是可以处理复杂的字典结构,而不会出现json模块的一些限制。但是需要注意的是,pickle模块只能在Python中使用,如果需要在其他语言中读取保存的文件,建议使用其他格式如JSON。

另外,如果希望将字典以更可读的方式写入文件,可以使用json.dumps方法的indent参数来设置缩进格式。例如:

import json
d = {"one":1, "two":2}
# 将字典以缩进格式写入文件
with open("text.txt", 'w') as file:
    file.write(json.dumps(d, indent=4))

这样写入的字典将以缩进格式保存在文件中,更易于人类阅读。

0