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

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

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

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

解答

扩展没有区别**,因为“The Pickle Protocol”每次都会运行。

也就是说,无论何时运行 pickle.dumps 或 pickle.loads,对象都会根据 pickle 协议进行序列化/反序列化。

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

pickle 协议是 python 特有的(并且有 几个版本)。它只是为用户自己重新使用数据而设计的->如果您将腌制文件发送给碰巧拥有不同版本的pickle / Python的其他人,则该文件可能无法正确加载而且你可能无法用另一种语言(如Java)对那个腌制文件做任何有用的事情。

因此,请使用您喜欢的 extensions,因为 picklerignore 它们。

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

source如果你想阅读更多

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

  • 1 正如@Mike Williamson 所述,pickle 文档中使用了pickle

  • 2 python标准库json模块加载以**.json**扩展名命名的文件。所以它会遵循 pickle 模块 会加载一个 .pickle 扩展。

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

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

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

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

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐