在 Python 中读取二进制文件

Manav Narula 2023年1月30日 2021年2月7日
  1. 用 Python 中的 open() 函数读取一个二进制文件
  2. 用 Python 中的 pathlib.Path 读取二进制文件
  3. 用 Python 中的 numpy.fromfile() 函数读取一个二进制文件
在 Python 中读取二进制文件

程序或内部处理器对二进制文件进行解释。它包含字节作为内容。当我们读取一个二进制文件时,会返回一个类型为 bytes 的对象。

用 Python 中的 open() 函数读取一个二进制文件

在 Python 中,我们有 open() 函数,用来创建一个文件对象,将文件的路径传给函数,并以特定的模式打开文件,默认为读模式。当我们打开二进制文件时,在以读、写或追加模式打开此类文件时,必须指定 b 参数。在本教程中,我们将处理二进制读取模式-rb

在下面的代码中,我们将读取一个二进制文件并从文件中打印一个字符。

with open("sample.bin","rb") as f:
    data = f.read()
    
print(data[2])

输出:

83

如果我们打印单个字符,那么我们可以查看整数。

Python 有一个名为 struct 的包,它有很多方法,可以用来处理存储在文件、数据库等资源中的二进制数据。

struct.unpack() 用来读取打包后的数据,以指定的格式布局。这种布局在打包和解压数据时使用,是用格式字符指定的。这些格式字符以及它们的大小如下所示。

结构解包格式字符表

请注意,struct.unpack() 函数总是返回一个元组。

import struct

with open("sample.bin","rb") as f:
    data = f.read()

unpack_result = struct.unpack('hhl', data[0:8])
print(unpack_result)

输出:

(1280, 27731, 7037801)

这里,hhl 表示短,短,长 int 作为数据格式布局,我们可以在输出中看到。这就是为什么解包的缓冲区只有 8 个字节,因为格式布局的大小是 8(2+2+4)。

用 Python 中的 pathlib.Path 读取二进制文件

我们也可以使用 pathlib 库中 Path 类中的 read_bytes() 方法,以字节模式读取文件,然后使用 struct.unpack() 函数解释数据,如前所述。

from pathlib import Path
import struct

data = Path('sample.bin').read_bytes() 

multiple = struct.unpack('ii', data[:8])

print(multiple)

输出:

(1817380096, 7037801)

用 Python 中的 numpy.fromfile() 函数读取一个二进制文件

NumPy 模块中提供了另一种有趣的方法。使用该模块中的 fromfile() 函数,我们可以在使用 dtype() 函数指定格式数据后,从文件中读取二进制数据。这被认为是一种快速的方法。下面的代码展示了如何实现这个功能。

import numpy as np

with open('sample.bin') as f:
    rectype = np.dtype(np.int32)
    bdata = np.fromfile(f, dtype=rectype)

print(bdata)

输出:

[1817380096    7037801]

在这里,我们将格式类型指定为 32 位整数,并使用 fromfile() 函数提取数据。

Author: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

相关文章 - Python File