【问题标题】:Writing binary files in Python 2.6+ and 3在 Python 2.6+ 和 3 中编写二进制文件
【发布时间】:2012-01-17 14:38:16
【问题描述】:

我正在编写一个需要编写二进制文件的程序。 In 包含字符串(键值对)和数字数据(可以是小端或大端)的标题,我正在寻找一种方法来编写在 Python 2.6+ 和 Python 3.2+ 中运行不变的程序。

谁能提出一些最佳做法?此外,在不使用struct.pack 混淆我的程序逻辑的情况下,处理字节顺序的正确方法是什么。我应该继承BufferedWriter吗?

提前致谢。

【问题讨论】:

  • 我认为为 Python3 编写代码会更容易,然后看看 Python2 有什么问题。同时为两者写作是一种痛苦(至少对我而言)。
  • 如果您将数字数据写入二进制文件,为什么要避免使用struct.pack?它专为该任务而设计。在将钉子钉入木头时,您会避免使用锤子吗?
  • 如果你给我们一个指向实际布局的指针会很有帮助,否则你需要说明什么是“字符串”(ASCII,UTF-8,其他东西;长度是如何确定的)什么是“数字数据”(float(大小?),int(有符号/无符号?大小?),其他),每个文件或每个数据项是否有一个字节序标志。

标签: python binary io python-3.x


【解决方案1】:

创建二进制数据后,只需将其写入以二进制模式打开的文件即可。这里的所有都是它的。 Python 2 和 3 之间完全没有兼容性问题。

完全没有必要对 BufferedWriter 进行子类化。

如何创建数据是一个不同的问题,但我没有看到任何明显的不兼容问题。

【讨论】:

  • 也许我遗漏了一些东西,但我仍然需要将数据放在某种类型的缓冲区中,因此我的问题仍然存在。
  • @Hernan:为什么需要将数据放在某种缓冲区中?通常一个 bytes() 字符串可以正常工作。
【解决方案2】:

不清楚您是否已经有需要匹配的预定义二进制文件格式,但如果没有,您只是试图以多种编程语言(以及多种编程语言)可以读取的方式序列化数据结构多平台的Python版本),你可能想看看Protocol Buffers

【讨论】:

    【解决方案3】:

    你可以使用 os.open + os.write + os.close。但是,这些都需要 while 循环来保证可靠性。

    我已经使用http://stromberg.dnsalias.org/~strombrg/bufsock.html(我写了它,我的前雇主允许我将它开源)完成了这项工作,以便在执行大量二进制 I/O 的重复数据删除备份程序中实现这一目标。即使您使用信号,这样做也不需要循环。不要让“bufsock”这个名字欺骗了你——它对文件 I/O 也有好处。

    顺便说一句,从长远来看,以依赖字节序的方式编写内容通常是一个错误。如果您对内置的 Python 工具不满意(我并不总是这样,EG 一旦我需要一个 3 字节整数类型),最好使用 divmod 256 拆分您的数字。另一种选择是使用 http://stromberg.dnsalias.org/~strombrg/base255.html 来获取可以空终止的字符串。

    【讨论】:

    • 字节顺序问题是我需要做的,因为它取决于规范。我会看看你的代码,谢谢!
    猜你喜欢
    • 2016-10-23
    • 2013-05-13
    • 1970-01-01
    • 2012-07-12
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2014-01-07
    相关资源
    最近更新 更多