【问题标题】:How to write a dictionary into an existing file?如何将字典写入现有文件?
【发布时间】:2013-11-24 00:02:46
【问题描述】:

假设我有一本字典,我想将它写入现有文件。如何在不丢失文件中可能已经存在的任何内容的情况下这样做?我的想法是做以下事情:

def write_report(r, filename):
        input_filename=open(filename, "a")
        input_filename.close()
        for (k,v) in r.items():
               input_filename.write(k,v)
        return filename

我要确保文件名正确包含字典。

【问题讨论】:

  • 根据文件中存在的同一个字典或将其附加到已经有其他内容的文件中?

标签: python dictionary python-3.3


【解决方案1】:

您可以使用json 模块读取和写入 JSON 格式的数据结构(即序列化为 JSON 并从 JSON 反序列化)。 例如:

import json

# load from file:
with open('/path/to/my_file.json', 'r') as f:
    try:
        data = json.load(f)
    # if the file is empty the ValueError will be thrown
    except ValueError:
        data = {}

# save to file:
with open('/path/to/my_file.json', 'w') as f:
    data['new_key'] = [1, 2, 3]
    json.dump(data, f)

【讨论】:

  • 这可能需要一些同步来确保线程安全:)
  • 当然,但同步是另一个问题。 :)
  • 当然,只是想让 OP 意识到这个问题;)
【解决方案2】:

泡菜可能是另一种选择:

import pickle

output = open('output.txt', 'ab+')
data = {'a': [1, 2, 3],}

pickle.dump(data, output)
output.close()

# read data
output = open('output.txt', 'rb')
obj_dict = pickle.load(output)    # 'obj_dict' is a dict object

但是只有被 pickle 序列化的数据才能被 pickle.load 读取。所以如果你想从文件中读取所有数据,你应该pickle.dump将所有数据放入文件中。

【讨论】:

  • 问题被标记为 python-3.3,其中import cPickle 是一个 ImportError(加速版本由import pickle 自动使用,只要它可用)。
【解决方案3】:

如果您想将字典中每个键值对的文本表示附加到文本文件中,您可以查看以下方法:

def write_report(r, filename):
    input_file=open(filename, "a")
    for k, v in r.items():
        line = '{}, {}'.format(k, v) 
        print(line, file=input_file)        
    input_file.close()

使用 with 语句可以更清晰地表达上述内容。

def write_report(r, filename):    
    with open(filename, "a") as input_file:
        for k, v in r.items():
            line = '{}, {}'.format(k, v) 
            print(line, file=input_file)

【讨论】:

    【解决方案4】:

    您已经使用 open(filename, "a") 完成的操作使用追加模式 - 这几乎是您所需要的。在追加模式下,您永远不会覆盖文件中已有的内容。问题是它不能保证你是唯一的一个写作者 - 如果任何写入可能是部分的,如果有多个作家在同一个文件上工作,它们可能会出现乱码。使用file locking 可以避免此类问题。

    但是,您发布的代码还有几个问题,例如在写入文件之前关闭文件,以及 write 只接受一个字符串参数这一事实。您需要将数据序列化为可管理的块,Python 自己的标准模块是pickleshelve 将内容存储在数据库文件中),而 JSON 是一种更广泛支持的格式。

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2017-08-05
      • 1970-01-01
      • 2012-11-19
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多