201

我在更改 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')

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

4

12 回答 12

350

Python 有pickle模块就是为了这种事情。

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

with open('saved_dictionary.pkl', 'wb') as f:
    pickle.dump(dictionary, f)
        
with open('saved_dictionary.pkl', 'rb') as f:
    loaded_dict = pickle.load(f)

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

于 2013-10-05T18:50:51.633 回答
217

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"

仅供参考:NPY 文件查看器

于 2015-08-26T00:05:53.207 回答
63

我们还可以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" ) )

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

于 2019-03-11T19:59:56.550 回答
21

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

于 2013-10-05T18:43:55.390 回答
20

保存并加载 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)
于 2018-08-27T17:57:09.107 回答
14

由于 Pickle 存在一些安全问题并且速度很慢(来源),我会选择 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)

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

于 2020-10-14T14:19:02.880 回答
13

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

您需要安装 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 数据并将其存储在数据对象中。

于 2019-11-17T10:45:32.623 回答
3

对于您正在处理的字符串字典,可以仅使用 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')
于 2013-10-05T22:22:08.937 回答
2

除非您真的想保留字典,否则我认为最好的解决方案是使用csvPython 模块来读取文件。然后,你得到数据行,你可以改变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"
于 2013-10-05T18:59:18.590 回答
2

I like using the pretty print module to store the dict in a very user-friendly readable form:

import pprint

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

Then, when recovering, read in the text file and eval() it to turn the string back into a dict:

def load_file(fname):
    try:
        with open(fname, "r") as f:
            dic = eval(f.read())
    except:
        dic = {}
    return dic
于 2021-05-10T22:55:08.423 回答
1

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

import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))
于 2017-11-07T23:38:12.400 回答
1
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)
于 2021-02-18T06:10:01.447 回答