将字典写入 txt 文件并将其读回?[重复]

2025-03-04 08:27:00
admin
原创
76
摘要:问题描述:我正在尝试将字典写入 txt 文件。然后通过使用 键入键来读取字典值raw_input。我觉得我只是缺少一步,但我已经寻找了一段时间了。我收到这个错误File "name.py", line 24, in reading print whip[name] TypeErro...

问题描述:

我正在尝试将字典写入 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.whipself.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)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   4062  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2781  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   101  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   118  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   103  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用