文件扩展名命名:.p vs .pkl vs .pickle

File extension naming: .p vs .pkl vs .pickle

在读取和写入 pickle 文件时,我注意到一些片段使用 .p 其他片段 .pkl 和一些完整的 .pickle。有没有一种最pythonic的方式来做到这一点?

我目前的观点是没有一个正确的答案,其中任何一个都足够了。事实上,写 awesome.pklawesome.sauce 的文件名在 运行 pickle.load(open(filename, "rb")) 时不会有什么不同。也就是说,文件扩展名只是一种约定,实际上并不影响底层数据。是吗?

奖励:如果我将 PNG 图像保存为 myimage.jpg 会怎么样?这会造成什么破坏?

扩展 没有区别 因为“Pickle 协议”运行 每次。

也就是说,只要 pickle.dumps 或 pickle.loads 是 运行,根据 pickle 协议,对象是 serialized/un-serialized。

(pickle 协议是一种序列化格式

pickle 协议是python特定的(并且有多个版本)。它只是真正为用户自己重新使用数据而设计的 -> 如果您将腌制文件发送给碰巧拥有 pickle/Python 的 不同版本 的其他人,那么该文件可能 无法正确加载 并且您可能无法使用其他语言(例如 Java.

使用该腌制文件做任何有用的事情

所以,使用你喜欢的扩展因为pickler忽略它们。

JSON是另一种更流行的数据序列化方式,它也可以被其他语言使用,不像pickle -但是它并不直接迎合 python,因此它不理解某些变量类型:/

source如果你想阅读更多

编辑:虽然您可以使用任何名称,但您应该使用什么?

  • 1 如@Mike Williamson 所述,pickle 用于 pickle 文档

  • 2 python 标准库 json 模块 加载以 .[=111= 命名的文件] 扩展名。所以它将遵循 pickle 模块 将加载 .pickle 扩展。

  • 3 使用 .pickle 还可以最大限度地减少被其他程序意外使用的可能性。

.p 扩展被一些其他程序使用,最著名的是 MATLAB 作为二进制 运行-time 文件的后缀[来源:one, two] . 有些风险 冲突

.pkl 被一些晦涩的 windows “迁移向导装箱单文件”[source] 使用。 发生冲突的风险 极低。

.pickle 仅用于 python pickling[source]。 没有冲突的风险