如何将字典保存到文件?

时间:2013-10-05 18:34:23

标签: python file dictionary python-3.x

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

我的文本文件格式如下:

memberID:member_name:member_email:member_phone

我将文本文件拆分为:

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

当我尝试更改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')

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

13 个答案:

答案 0 :(得分:205)

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)

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

请注意,pickle.HIGHEST_PROTOCOL是一种二进制格式,虽然不是很方便,但对性能有好处。协议0是一种文本格式。

为了保存Python集合,有shelve模块。

答案 1 :(得分:133)

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

import numpy as np

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

# Load
read_dictionary = np.load('my_file.npy').item()
print(read_dictionary['hello']) # displays "world"

仅供参考:NPY file viewer

答案 2 :(得分:16)

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

答案 3 :(得分:9)

将字典保存并加载到文件中

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)

答案 4 :(得分:2)

除非你真的想保留字典,否则我认为最好的解决方案是使用csv Python模块来读取文件。 然后,您获得了数据行,您可以更改member_phone或任何您想要的内容; 最后,您可以再次使用csv模块以相同的格式保存文件 当你打开它时。

阅读代码:

import csv

with open("my_input_file.txt", "r") as f:
   reader = csv.reader(f, delimiter=":")
   lines = list(reader)

写作代码:

with open("my_output_file.txt", "w") as f:
   writer = csv.writer(f, delimiter=":")
   writer.writerows(lines)

当然,您需要调整change()功能:

def change(lines):
    a = input('ID')
    for line in lines:
      if line[0] == a:
        d=str(input("phone"))
        line[3]=d
        break
    else:
      print "not"

答案 5 :(得分:2)

对于字符串的字典,例如您正在处理的字典,可以仅使用Python的内置文本处理功能来完成。

(注意如果值是其他值,这将不起作用。)

with open('members.txt') as file:
    mdict={}
    for line in file:
        a, b, c, d = line.strip().split(':')
        mdict[a] = b + ':' + c + ':' + d

a = input('ID: ')
if a not in mdict:
    print('ID {} not found'.format(a))
else:
    b, c, d = mdict[a].split(':')
    d = input('phone: ')
    mdict[a] = b + ':' + c + ':' + d  # update entry
    with open('members.txt', 'w') as file:  # rewrite file
        for id, values in mdict.items():
            file.write(':'.join([id] + values.split(':')) + '\n')

答案 6 :(得分:2)

我还没有计时,但我打赌h5比泡菜更快;带压缩的文件大小几乎肯定会更小。

import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))

答案 7 :(得分:2)

在字典或某些其他数据可以轻松地映射为JSON格式的情况下,我们也可以使用json模块。

将数据序列化到文件中

import json
json.dump( data, open( "file_name.json", 'w' ) )

从文件中读取数据:

import json
data = json.load( open( "file_name.json" ) )

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

答案 8 :(得分:1)

快速而肮脏的解决方案:将字典转换为字符串并保存到文件,例如:

#dict could be anything:

savedict = open('savedict001.txt', 'w')
savedict.write(str(dict))
savedict.close()

答案 9 :(得分:1)

由于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)

阅读很容易:

with open(file, 'r') as f:
    data = json.load(f)

这类似于this answer,但是可以正确实现文件处理。

答案 10 :(得分:0)

我建议您使用JSON格式而不是pickle格式保存数据,因为JSON的文件易于阅读,因为您的数据很小,因此使调试更加容易。其他程序还使用JSON文件读取和写入数据。您可以详细了解here

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

pip install json


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

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

# To read data from file:
data = json.load( open( "myfile.json" ) )

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

答案 11 :(得分:0)

file_name = open("data.json", "w")
json.dump(test_response, file_name)
file_name.close()

或者使用上下文管理器,这是更好的:

with open("data.json", "w") as file_name:
    json.dump(test_response, file_name)

答案 12 :(得分:0)

我喜欢使用漂亮的打印模块以非常用户友好的可读形式存储字典:

def store_dict(fname, dic):
    with open(fname, "w") as f:
        f.write(pprint.pformat(dic, indent=4, sort_dicts=False))
        # note some of the defaults are: indent=1, sort_dicts=True

然后,在恢复时,读入文本文件并eval()将字符串转回字典:

def load_file(fname):
    try:
        with open(fname, "r") as f:
            dic = eval(f.read())
    except:
        dic = {}
    return dic