【问题标题】:Pickle is not saving data to a file with a formatted string namePickle 没有将数据保存到具有格式化字符串名称的文件中
【发布时间】:2021-03-24 16:26:50
【问题描述】:

我对下面代码的行为感到困惑。有两个问题;我不确定它们是否以某种奇怪的方式相关。

第一个问题是更重要的问题。该代码应保存两个包含相同数据的文件。然而,test.pkl 大约是 79 kB,而另一个是空的。为什么创建文件后那里没有保存任何内容?

我注意到的第二个问题是第二个文件被保存为e-v-w1-n2-2020-12-13-19 之类的东西,没有任何文件扩展名。 .pkl 怎么了?

我在 Windows 10 上使用 Python 3.8 和 pickle 4.0。

import pickle
import numpy as np
import datetime

n = 100
z = np.zeros((n,n))
with open("test.pkl" , 'wb') as myfile:
    pickle.dump(z, myfile)

filename = "e-v-w%s-n%s-%s.pkl" % (1, 2, datetime.datetime.now().strftime("%Y-%m-%d-%H:%M"))
print(filename)
with open(filename, "wb") as outfile:
    pickle.dump(z, outfile, pickle.HIGHEST_PROTOCOL)

顺便说一句,当我打印filename 时,.pkl 应该会出现。

【问题讨论】:

  • 逐步调试和异常捕获会告诉您问题所在。在进行 SO 开发之前,这是一个值得采用的仪式。
  • 谢谢!我没有想到这一点,因为我以前从未真正使用过。根据您的评论,我刚刚学会了如何使用pdb 的基本功能。但是,有些事情我不明白 - 异常捕获在这里有什么帮助?代码运行完成,没有抛出任何错误。
  • 在此处查看第二个答案stackoverflow.com/questions/713794/…
  • 谢谢 - 如果我理解的话,with 语句中有一个我们可以捕获的错误,但 Python 不会停止执行代码(只是 with 块) .很高兴知道。

标签: python pickle


【解决方案1】:

Windows 文件路径中不允许使用冒号 (":"),例如 this post

您的strftime 格式包含一个冒号,这使得该路径无法写入,并且可能也是冒号后面的字符(就像.pkl 扩展名)丢失的原因。

在 Unix 平台上运行代码按预期工作。只需更改您的 strftime 格式,使其与 Windows 兼容。

【讨论】:

  • 谢谢!就是这样。是的,使用格式化字符串的第二次调用来自之前在 Unix 上运行的代码,我在重读代码时错过了冒号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多