python - 更新 Python Pickle 文件

标签 python database data-structures pickle binaryfiles

如果我有一个相当大的数据结构,例如列表或字典,并且我将其从 pickle 文件加载到 Python 中,然后仅修改一两条记录,我可以只更新文件中的这些记录吗?必须将整个数据结构写回文件吗?这个想法是为了避免过多和不必要的硬盘事件,尤其是写入。

如果我做不到,我想我需要升级到数据库?

更新: 我尝试了 @Pynchia 的建议,使用 shelve 模块,它完成了存储和修改数据的工作。我只需要确认,当我修改单个电话号码字段时,只有该字段或最多一条记录被写入磁盘,而不是整个数据集。 是这样还是不是?这就是问题所在。

import shelve

s = shelve.open('test.dat')
for i in range(3):
    record = {'name': 'ABC'+str(i), 'phone': ((str(i)*3)+'-'+(str(i)*4)),
              'addr': (str(i)*3)+' Main St'}
    s[str(i)] = record
s.close

s = shelve.open('test.dat')
for i in range(3):
    print(s[str(i)])
s.close

s = shelve.open('test.dat')
temp = s['1']
temp['phone']='1-800-GET-PYTHON'
s['1']=temp
s.close

print()
s = shelve.open('test.dat')
for i in range(3):
    print(s[str(i)])
s.close

输出:

{'name': 'ABC0', 'addr': '000 Main St', 'phone': '000-0000'}
{'name': 'ABC1', 'addr': '111 Main St', 'phone': '111-1111'}
{'name': 'ABC2', 'addr': '222 Main St', 'phone': '222-2222'}

{'name': 'ABC0', 'addr': '000 Main St', 'phone': '000-0000'}
{'phone': '1-800-GET-PYTHON', 'addr': '111 Main St', 'name': 'ABC1'}
{'name': 'ABC2', 'addr': '222 Main St', 'phone': '222-2222'}

最佳答案

pickle 文件格式是顺序格式。因此,如果更改一项,至少文件中该位置后面的所有内容都必须重写。

不幸的是,我不知道也无法想象更新单个项目应该如何工作。

根据数据的结构,我看到两种可能性:

  1. 可以表示为行并且每个字段仅包含少量数据的数据=>使用像sqlite这样的数据库(还有许多其他数据库,一些是面向文档的,一些像字典一样)
  2. 少量的大型数据集 => 使用 HDF5 容器文件。 HDF5 用于存储大型数据集并仅访问必要的部分

关于python - 更新 Python Pickle 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33334667/

相关文章:

python - Django RawQuerySet.__repr__ : not enough arguments for format string

javascript - 适用于 JavaScript 和 Python 的构建工具

mysql - SQL 根据另一表列条件更新一个表列

performance - 异或链表的目的?

python - 对于仿真系统,哪种数据结构最合适?

php - 如果状态为空而无需在 php 中提交表单,如何更新数据库中的状态?

database - 如何使用普通 jdbc 来使用分布式事务 JTA

c++ - 找到小于或等于当前塔的先前塔的数量

algorithm - 允许按键访问的排序数据结构

python - 识别python中的特定异常