【发布时间】:2020-12-29 18:25:14
【问题描述】:
我有一个简单的过程,可以将项目读取和写入文件。有时,如果我在读取过程中终止 Python 进程(控制台中的“Ctrl c”),文件会损坏并且无法再读取。我怎样才能防止这种情况?我已经将“rb”作为打开模式。也许我可以确保python在文件打开例程中不会取消?
代码如下:
import dill
results = []
with open(self.getFile(), 'rb') as input:
if n is not None:
for i in range(n):
try:
results.append(dill.load(input))
except (EOFError, pickle.UnpicklingError) as e:
print('ERROR with reading {}'.format(self.getFile()))
pass
为了完整起见,还有写作过程——希望是无关紧要的。
def write(self, objects):
with open(self.getFile(), 'wb') as output:
for object in objects:
dill.dump(object, output, pickle.HIGHEST_PROTOCOL)
问题又发生了,现在我可以看到完整的错误:
results.append(dill.load(input))
File "/home/x/anaconda3/envs/myenv3/lib/python3.6/site-packages/dill/_dill.py", line 270, in load
return Unpickler(file, ignore=ignore, **kwds).load()
File "/home/x/anaconda3/envs/myenv3/lib/python3.6/site-packages/dill/_dill.py", line 472, in load
obj = StockUnpickler.load(self)
EOFError: Ran out of input
【问题讨论】:
-
去掉try-except或者使用"traceback.print_exc()"查看实际错误
-
为了使文件损坏,需要将其写入。读取它永远不会改变它的内容。 Something 将不完整的数据写入该文件。
write是否可能同时执行? -
本身不相关,但您在代码中使用了一些保留关键字 -
object和input是您不应该使用的内置名称。