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

28
阅读和写入pickle文件时,我注意到一些片段使用`.p`,另一些使用`.pkl`,还有些使用完整的`.pickle`。是否有一种最pythonic的方法?
我的看法是没有一个正确答案,任何一种都可以。实际上,当运行`pickle.load(open(filename, "rb"))`时,写成`awesome.pkl`或者`awesome.sauce`的文件名在程序中并无区别。也就是说,文件扩展名只是一种约定,并不会影响基础数据。这样说对吗?
奖励问题:如果我将PNG图像保存为`myimage.jpg`会造成什么破坏?

奖金:这取决于你在保存后使用什么程序打开它。有些程序可能足够聪明,能够检测到它实际上是一个PNG而不是像文件名所暗示的JPEG,并将其作为PNG图像打开,从而不会造成任何混乱。这可以通过两种文件的起始字节序列的不同来实现。PNG文件以十六进制字节89 50 4e 47 0d 0a 1a 0a开头,参见https://www.w3.org/TR/2003/REC-PNG-20031110/#5DataRep。JPEG文件以十六进制字节`ff d8`开头,参见https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure。 - MarcellPerger
1个回答

30

扩展名并没有任何区别,因为每次都会执行“Pickle协议”

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

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

Pickle协议是Python特定的(有多个版本)。它只是为了让用户重新使用数据 -> 如果您将pickled文件发送给某个有不同版本pickle/Python的人,则该文件可能无法正确加载,而且您可能无法在像Java这样的其他语言中对该pickled文件执行任何有用操作。

因此,使用您喜欢的扩展名,因为拾取器忽略它们。

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

如果您想阅读更多信息

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

  • 1 如@Mike Williamson所提到的,在pickle文档中使用.pickle

  • 2 Python标准库的json模块会加载以.json扩展名命名的文件。因此,pickle模块将加载一个.pickle扩展名。

  • 3 使用.pickle也可以最小化其他程序意外使用的可能性。

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

.pkl被某些不知名的Windows“迁移向导打包列表文件”使用[来源:source]。冲突风险极低。

.pickle仅用于Python pickling[来源:source]。没有冲突风险。


9
是的,Harry,这一切都是真的,但我认为这并没有回答原帖的问题。原帖作者有一种强烈的直觉——很正确——即选择一个格式而不是另一个格式在技术上没有区别。但他想知道是否有更符合Python语言特色的方式。换句话说,风格指南会推荐什么?我来到这里是为了寻找建议。查看pickle文档,它们使用.pickle,但根据我的经验,我更多地见过.p.pkl。我在PEP中没有找到任何明确讨论这个问题的内容。:( - Mike Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接