python - 在 Python 中将二进制数据写入文件

标签 python file python-3.x binary

我正在尝试将数据(文本、 float 据)写入二进制文件,稍后将由另一个程序读取。问题是这个程序(在 Fort95 中)非常特别;每个字节都必须位于正确的位置才能正确读取文件。我试过使用 Bytes 对象和 .encode() 来写入,但运气不佳(我可以从文件大小看出它正在写入额外的数据字节)。我试过的一些代码:

mgcnmbr='42'
bts=bytes(mgcnmbr)
test_file=open(PATH_HERE/test_file.dat','ab')
test_file.write(bts)
test_file.close()

我也试过:

mgcnmbr='42'
bts=mgcnmbr.encode(utf_32_le)
test_file=open(PATH_HERE/test_file.dat','ab')
test_file.write(bts)
test_file.close()

澄清一下,我需要的是整数值 42,以 4 字节二进制形式编写。接下来,我将以 4 字节二进制形式写入数字 1 和 0。那时,我应该正好有 12 个字节。每个都是一个 4 字节有符号整数,用二进制写成。我是 Python 的新手,似乎无法解决问题。有什么建议么?类似 this 的东西?我需要完全控制每个整数(以及后来的 4 字节 float )的字节数。

谢谢

最佳答案

您需要 struct模块。

import struct

fout = open('test.dat', 'wb')

fout.write(struct.pack('>i', 42))
fout.write(struct.pack('>f', 2.71828182846))

fout.close()

struct.pack 中的第一个参数是格式字符串。

格式字符串中的第一个字符指示字节顺序或 endianness数据的(最重要或最不重要的字节首先存储 - big-endian 或 little-endian)。字节顺序因系统而异。如果“>”不起作用,请尝试“<”。

格式字符串中的第二个字符是数据类型。不出所料,“i”代表整数,“f”代表 float 。字节数由类型决定。例如,短裤或“h”是两个字节长。还有无符号类型的代码。例如,“H”对应于一个无符号短。

struct.pack 中的第二个参数当然是要打包到 bytes 对象中的值。

这是我告诉你我在一些事情上撒了谎的部分。首先我说字节数是由类型决定的。这只是部分正确。给定类型的大小在技术上取决于平台,因为 C/C++ 标准(struct 模块所基于的标准)仅指定最小 大小。这让我想到了第二个谎言。格式字符串中的第一个字符还编码是使用标准(最小)字节数还是使用 native (平台相关)字节数。 (“>”和“<”都保证使用标准的最小字节数,在整数“i”或 float “f”的情况下实际上是四个。)它另外编码 alignment。的数据。

documentation on the struct module有格式字符串参数表。

您还可以将多个原语打包到一个字节对象中并实现相同的结果。

import struct

fout = open('test.dat', 'wb')

fout.write(struct.pack('>if', 42, 2.71828182846))

fout.close()

您当然可以使用 struct.unpack 解析二进制数据。

关于python - 在 Python 中将二进制数据写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25168616/

相关文章:

python - 格式化 Bokeh 表小部件

python - 线程安全和容错文件写入

python - 在稀疏设计矩阵上使用 rpy2 运行 glmnet?

python - 如何计算递归函数中的案例数?

python - 我们可以通过 python 获取文件的唯一 ID 吗?

java - 如何在Java中正确读取文件中的整数

shell - 如何将 shell 脚本的所有输出写入单个新文件

python - 使用 Selenium Web 驱动程序为每个选项卡进行一个 session ?

python-3.x - 音乐无法从文件中播放,但在IDLE中可以正常播放

python - 如何正确执行ManyToMany字段的django查询