更新 Python Pickle 文件
Updating a Python Pickle File
如果我有一个相当大的数据结构,如列表或字典,我将它从 pickle 文件加载到 Python,然后只修改一两个记录,我可以只更新那些记录吗在文件中还是我必须将整个数据结构写回到文件中?这个想法是为了避免过多和不必要的硬盘驱动器activity,尤其是写入。
如果我做不到,我想我需要升级到数据库吗?
更新:
我尝试了@Pynchia 的建议来使用 shelve
模块,它完成了存储和修改数据的工作。我只需要确认当我修改单个 phone 数字字段时,只有那个字段或最多一条记录被写入磁盘,而不是整个数据集。 是不是?就是这个问题。
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 文件格式是顺序格式。因此,如果您更改一项,至少必须重写文件中该位置后面的所有内容。
不幸的是,我不知道也无法想象更新单个项目应该如何工作的任何可能性。
根据您的数据结构,我看到两种可能性:
- 可以表示为行且每个字段仅包含少量数据的数据 => 使用像 sqlite 这样的数据库(还有许多其他数据库,一些面向文档,一些像字典)
- 少数大型数据集 => 使用 HDF5 容器文件。 HDF5 用于存储大型数据集并且只访问必要的部分
如果我有一个相当大的数据结构,如列表或字典,我将它从 pickle 文件加载到 Python,然后只修改一两个记录,我可以只更新那些记录吗在文件中还是我必须将整个数据结构写回到文件中?这个想法是为了避免过多和不必要的硬盘驱动器activity,尤其是写入。
如果我做不到,我想我需要升级到数据库吗?
更新:
我尝试了@Pynchia 的建议来使用 shelve
模块,它完成了存储和修改数据的工作。我只需要确认当我修改单个 phone 数字字段时,只有那个字段或最多一条记录被写入磁盘,而不是整个数据集。 是不是?就是这个问题。
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 文件格式是顺序格式。因此,如果您更改一项,至少必须重写文件中该位置后面的所有内容。
不幸的是,我不知道也无法想象更新单个项目应该如何工作的任何可能性。
根据您的数据结构,我看到两种可能性:
- 可以表示为行且每个字段仅包含少量数据的数据 => 使用像 sqlite 这样的数据库(还有许多其他数据库,一些面向文档,一些像字典)
- 少数大型数据集 => 使用 HDF5 容器文件。 HDF5 用于存储大型数据集并且只访问必要的部分