莳萝在使用“加载”时删除对象

时间:2018-12-04 19:36:35

标签: python dill

我遇到一个让我发疯的错误。我生成了一些数值模拟数据sim_data.dill,然后使用

将其保存到计算机上的目录中
with open(os.path.join(original_directory, 'sim_data.dill'), 'w' as f:
    dill.dump(outputs, f)

此数据约为1 Gb,需要一段时间才能生成。现在,当我尝试使用

从其他程序加载该文件时,我将该文件从original_directory复制到了new_directory
simfile  = '/new_directory/sim_data.dill'
with open(simfile, 'r') as f:
    outputs = dill.load(f)

发生两件事之一:

  1. 程序显示文件UnpicklingError: [Errno 2] No such file or directory: .../ 原始目录 /sim_data.dill丢失。这意味着莳萝将original_directory放在文件的元数据中,并在文件移动时拒绝打开它;真正令人震惊的行为。
  2. 当我将文件复制回new_directory时,尝试打开它会得到EOFError和莳萝 将文件更改为零字节,实际上是将其删除 < / strong>。更糟的是。

我可以使用标准的with open(simfile, 'r') as f; print f.readlines()来读取文件,但是显然,这在尝试恢复文件的内部类结构时无济于事。

1 个答案:

答案 0 :(得分:2)

显然,这是dill的正常行为;请参阅:

https://github.com/uqfoundation/dill/issues/296

改写:文件位置是要酸洗的文件句柄的一部分,因此,在没有该信息的情况下取消酸洗是不可能的。显然,这意味着,如果将.dill文件保存在一个位置,请手动移动该文件(例如,移至更方便的目录),然后尝试再次打开它,将无法使用。

关于删除问题,以上文章的作者建议使用fmode=FMODE_PRESERVEDATA或以下列出的其他文件模式之一 https://github.com/matsjoyce/dill/blob/087c00899ef55f31d36e7aee51a958b17daf8c91/dill/dill.py#L136-L145