如何将字典保存到文件?

Xue*_*ang 114 python dictionary file python-3.x

我有更改dict值并将dict保存到文本文件(格式必须相同)的问题,我只想更改member_phone字段.

我的文本文件格式如下:

memberID:member_name:member_email:member_phone
Run Code Online (Sandbox Code Playgroud)

我将文本文件拆分为:

mdict={}
for line in file:
    x=line.split(':')
    a=x[0]
    b=x[1]
    c=x[2]
    d=x[3]
    e=b+':'+c+':'+d

    mdict[a]=e
Run Code Online (Sandbox Code Playgroud)

当我尝试更改member_phone存储的时d,值已经改变而不是按键流动,

def change(mdict,b,c,d,e):
    a=input('ID')
    if a in mdict:
        d= str(input('phone'))
        mdict[a]=b+':'+c+':'+d
    else:
        print('not')
Run Code Online (Sandbox Code Playgroud)

以及如何将dict保存为具有相同格式的文本文件?

Zah*_*Zah 222

Python有pickle模块只是为了这种事情.

这些功能是保存和加载几乎任何对象所需的全部功能:

def save_obj(obj, name ):
    with open('obj/'+ name + '.pkl', 'wb') as f:
        pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)

def load_obj(name ):
    with open('obj/' + name + '.pkl', 'rb') as f:
        return pickle.load(f)
Run Code Online (Sandbox Code Playgroud)

这些函数假定obj您当前工作目录中有一个文件夹,该文件夹将用于存储对象.

请注意,pickle.HIGHEST_PROTOCOL是一种二进制格式,它不总是方便,但有利于提高性能.协议0是文本格式.

为了保存Python的集合,有一个shelve模块.

  • @Toothpick Anemone:向模式添加`+` 不会影响您的问题(andrey.s 不正确)。你的问题听起来像是因为一两件事。为了让这个答案中的 `save_obj()` 工作,一个名为 `"obj"` 的子目录必须**已经存在**,因为 `open()` 不会自动创建一个。第二个 `save_obj()` 的第一个参数是要保存的 Python 对象,而不是子目录的名称(尽管并不完全清楚示例 `save_obj(Q, "Qtable") 中的 `Q` 是什么意思) `调用)。你可以创建一个目录,如果它没有用 `os.mkdir()` 退出。 (4认同)
  • `save_obj` 似乎要求文件 `obj/'+ name + '.pkl` 已经存在。我创建了一个名为“Q”的字典,填充它,然后调用“save_obj(Q,“Qtable”)”我收到错误:“FileNotFoundError:[Errno 2]没有这样的文件或目录:'obj/Qtable.pkl” '` 在写入文件之前如何首先创建文件? (2认同)
  • @ToothpickAnemone 使用 `wb+` 创建文件,即: `with open('obj/'+ name + '.pkl', 'wb+')` (2认同)
  • @andrey.s:我认为你说的不会有什么不同,因为它没有解决问题。 (2认同)

Fra*_*urt 146

Pickle可能是最好的选择,但是如果有人想知道如何使用NumPy保存和加载字典到文件:

import numpy as np

# Save
dictionary = {'hello':'world'}
np.save('my_file.npy', dictionary) 

# Load
read_dictionary = np.load('my_file.npy',allow_pickle='TRUE').item()
print(read_dictionary['hello']) # displays "world"
Run Code Online (Sandbox Code Playgroud)

仅供参考:NPY文件查看器

  • 什么是.item()? (4认同)
  • @frank 可能性,因为pickle 是python 标准库的一部分,其中numpy 是一个独立项目。 (2认同)
  • 从我查找的@Gulzar,np.load返回一个ndarray(做一个`type(read_dictionary)`显示如此)和.item()基本上将该元素转换为python标量对象,这是一个字典,如[here]所示( https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.item.html#numpy.ndarray.item) (2认同)
  • @Shai您是否安装了numpy软件包...? (2认同)

Joh*_*ohn 18

我不确定你的第一个问题是什么,但如果你想保存字典到文件,你应该使用该json库.查看加载和放置函数的文档.

  • @mguijarr但解析它并不容易.另外,json易于手动编辑并导入到任何其他程序中. (5认同)
  • 我喜欢约翰的建议 - 请参阅这篇文章以获得一个很好且简单的示例http://stackoverflow.com/a/11027021/765827 (2认同)

小智 12

我建议使用 JSON 格式而不是 pickle 格式保存您的数据,因为 JSON 的文件是人类可读的,这使您的调试更容易,因为您的数据很小。其他程序也使用 JSON 文件来读取和写入数据。你可以在这里阅读更多关于它的信息

您需要安装 JSON 模块,您可以使用 pip 来安装:

pip install json


# To save the dictionary into a file:
json.dump( data, open( "myfile.json", 'w' ) )
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为 myfile.json 的 json 文件。

# To read data from file:
data = json.load( open( "myfile.json" ) )
Run Code Online (Sandbox Code Playgroud)

这会读取 myfile.json 数据并将其存储在数据对象中。


小智 10

保存并加载dict到文件:

def save_dict_to_file(dic):
    f = open('dict.txt','w')
    f.write(str(dic))
    f.close()

def load_dict_from_file():
    f = open('dict.txt','r')
    data=f.read()
    f.close()
    return eval(data)
Run Code Online (Sandbox Code Playgroud)


sim*_*eco 9

json如果字典或其他一些数据可以轻松地映射为JSON格式,我们也可以使用该模块

import json

# Serialize data into file:
json.dump( data, open( "file_name.json", 'w' ) )

# Read data from file:
data = json.load( open( "file_name.json" ) )
Run Code Online (Sandbox Code Playgroud)

该解决方案带来了许多好处,例如,以不变的格式适用于Python 2.xPython 3.x此外,以JSON格式保存的数据可以在许多不同的平台或程序之间轻松传输。这些数据也是人类可读的

  • 为了获得美观、可读的 .json,请执行以下操作:`with open('file_name.json', 'w',encoding='utf-8') as f: json.dump(data, f, Ensure_ascii=False ,缩进=4)` (11认同)
  • 好方法,但我认为直接使用“open”而不是“with”创建的上下文是不安全的。是否可以保证,如果“json.dump”失败,文件句柄将被关闭? (7认同)

Mic*_*ner 9

由于 Pickle 有一些安全问题并且速度很慢(source),我会选择 JSON,因为它快速、内置、人类可读且可互换:

import json
data = {'another_dict': {'a': 0, 'b': 1}, 'a_list': [0, 1, 2, 3]}
# e.g. file = './data.json' 
with open(file, 'w') as f: 
    json.dump(data, f)
Run Code Online (Sandbox Code Playgroud)

阅读也很简单:

with open(file, 'r') as f:
    data = json.load(f)
Run Code Online (Sandbox Code Playgroud)

这与此答案类似,但正确实现了文件处理。

  • 感谢您正确实施文件处理! (3认同)