Python二进制文件读取问题

Dan*_*rip 3 python binary file-io matlab

我正在尝试在Python中读取二进制文件(代表Matlab中的矩阵).但我无法读取文件并将字节转换为正确的值.

二进制文件由一系列4字节数组成.前两个数字分别是行数和列数.我的朋友给了我一个Matlab函数,他用fwrite编写了这个函数.我想做这样的事情:

f = open(filename, 'rb')
rows = f.read(4)
cols = f.read(4)
m = [[0 for c in cols] for r in rows]
r = c = 0
while True:
    if c == cols:
        r += 1
        c = 0
    num = f.read(4)
    if num:
        m[r][c] = num
        c += 1
    else:
        break
Run Code Online (Sandbox Code Playgroud)

但每当我使用f.read(4)时,我会得到类似'\ x00\x00\x00\x04'的内容(此具体示例应代表4),我无法弄清楚将其转换为正确的数字(使用int,hex或类似的东西不起作用).我偶然发现了struct.unpack,但这似乎没什么帮助.

下面是一个示例矩阵和相应的二进制文件(当我使用python函数f.read()读取整个文件时没有任何大小参数),Matlab函数为它创建:

4     4     2     4
2     2     2     1
3     3     2     4
2     2     6     2

'\x00\x00\x00\x04\x00\x00\x00\x04@\x80\x00\x00@\x00\x00\x00@@\x00\x00@\x00\x00\x00@\x80\x00\x00@\x00\x00\x00@@\x00\x00@\x00\x00\x00@\x00\x00\x00@\x00\x00\x00@\x00\x00\x00@\xc0\x00\x00@\x80\x00\x00?\x80\x00\x00@\x80\x00\x00@\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)

所以前4个字节和第5个8字节都应该是4,因为矩阵是4x4.然后它应该是4,4,2,4,2,2,2,1等...

多谢你们!

Ale*_*lli 7

rows = f.read(4)
cols = f.read(4)
Run Code Online (Sandbox Code Playgroud)

这两个名称现在绑定到4字节字符串.把它们变成整数,

import struct

rowsandcols = f.read(8)
rows, cols = struct.unpack('=ii', rowsandcols)
Run Code Online (Sandbox Code Playgroud)

请参阅该文档struct.unpack.

  • 考虑到数据被描述为big-endian并且今天最受欢迎的CPU是little-endian,也许应该是`!`或`>`而不是`=`? (2认同)