在Python 2.6+和3中写入二进制文件

0 投票
3 回答
1127 浏览
提问于 2025-04-17 08:07

我正在写一个程序,需要生成一个二进制文件。这个文件里有一些字符串的头部(键值对)和数字数据(这些数据可以是小端格式或大端格式)。我希望这个程序在Python 2.6以上和Python 3.2以上的版本中都能正常运行。

有没有人能给我一些好的建议?另外,处理字节顺序(endianness)的时候,有什么好的方法,不让我的程序逻辑变得复杂,比如不想用struct.pack。我是不是应该去继承BufferedWriter

提前谢谢大家。

3 个回答

0

不太清楚你是否已经有一个固定的二进制文件格式需要遵循,但如果没有,而你只是想把你的数据结构以一种可以被多种编程语言(以及多个Python版本和平台)读取的方式进行序列化,那么你可以考虑看看协议缓冲区(Protocol Buffers)

0

你可以使用 os.open、os.write 和 os.close 这几个函数。不过,这样做需要用到循环,以确保操作的可靠性。

我曾经用过一个叫做 http://stromberg.dnsalias.org/~strombrg/bufsock.html 的工具(这是我写的,我以前的公司允许我把它开源)来实现一个去重备份程序,这个程序需要处理很多二进制输入输出。用这种方式就不需要循环,即使你在使用信号也没问题。别被“bufsock”这个名字误导了,它同样适合文件的输入输出。

顺便说一下,以依赖字节序的方式写东西通常在长远来看是个错误。如果你对Python自带的工具不满意(我有时候也不满意,比如我曾经需要一个3字节的整数类型),那可能更好用 divmod 256 来拆分你的数字。另一个选择是使用 http://stromberg.dnsalias.org/~strombrg/base255.html 来获取可以以空字符结束的字符串。

1

一旦你创建了二进制数据,你只需要把它写入一个以二进制模式打开的文件。就这么简单。这里面没有Python 2和3之间的兼容性问题。

继承BufferedWriter完全没有必要。

至于你如何创建这些数据,那是另一个问题,不过我觉得在这方面也没有明显的兼容性问题。

撰写回答