gpt4 book ai didi

python - 是否有可能检测到损坏的 Python 词典

转载 作者:行者123 更新时间:2023-11-28 18:23:29 26 4
gpt4 key购买 nike

我使用 python 2.7 中的 shelve 模块保存了一个数据文件,该文件不知何故已损坏。我可以用 db = shelve.open('file.db') 加载它,但是当我调用 len(db) 甚至 bool(db) 它挂起,我必须终止进程。

但是,我能够遍历整个过程并创建一个新的未损坏文件:

db = shelve.open('orig.db')
db2 = shelve.open('copy.db')
for k, v in db.items():
db2[k] = v
db2.close() # copy.db will now be a fully working copy

问题是,我怎样才能测试字典并避免挂起?

顺便说一句,我还有原始文件,当它被复制到其他机器时它表现出相同的行为,以防有人也想帮助我弄清楚文件到底出了什么问题!

最佳答案

除了dbm.whichdb(),我不知道有任何检查方法.用于调试可能的 pickle protocol以允许您使长时间运行的测试超时的方式不匹配可以尝试:

import shelve
import pickle
import dbm
import multiprocessing
import time
import psutil

def protocol_check():
print('orig.db is', dbm.whichdb('orig.db'))
print('copy.db is', dbm.whichdb('copy.db'))
for p in range(pickle.HIGHEST_PROTOCOL + 1):
print('trying protocol', p)
db = shelve.open('orig.db', protocol=p)
db2 = shelve.open('copy.db')
try:
for k, v in db.items():
db2[k] = v
finally:
db2.close()
db.close()
print('great success on', p)

def terminate(grace_period=2):
procs = psutil.Process().children()
for p in procs:
p.terminate()
gone, still_alive = psutil.wait_procs(procs, timeout=grace_period)
for p in still_alive:
p.kill()

process = multiprocessing.Process(target=protocol_check)
process.start()
time.sleep(10)
terminate()

关于python - 是否有可能检测到损坏的 Python 词典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43278731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com