如何在 Python 中读取二进制文件

Python 是一种广泛使用的编程语言,它可以被用于读取,编写和处理各种文件类型,包括文本文件和二进制文件。在 Python 中读取二进制文件,需要使用二进制读写模式,这可以通过打开文件时指定 ‘rb’ 参数来实现。本文将介绍如何在 Python 中读取二进制文件,并给出代码示例和注意事项。

一、打开二进制文件

在 Python 中打开二进制文件需要指定 ‘rb’ 参数。使用 open() 函数打开文件时,必须指定要打开的文件名和打开模式(’rb’)。

例如:

with open('file.bin', 'rb') as f:
    # 读取二进制文件

注意:如果文件模式为 ‘r’,则将文件视为一个文本文件,而不是一个二进制文件。

二、读取二进制数据

一旦文件被打开,就可以读取文件中的二进制数据了。可以使用 read() 或 readinto() 函数从文件中读取数据。

  • read() 函数

read() 函数用于从文件中读取一定数量的字节。它的语法如下:

data = f.read(size)

其中,f 为文件对象,size 是要读取的字节数。如果 size 未指定,则读取整个文件。

例如:

with open('file.bin', 'rb') as f:
    data = f.read(16)
    print(data)

该代码将读取文件的前 16 个字节,并打印到控制台。

  • readinto() 函数

readinto() 函数用于从文件中读取一定数量的字节,并将数据存储在预先分配的缓冲区中。它的语法如下:

buffer = bytearray(size)
num_bytes_read = f.readinto(buffer)

其中,f 为文件对象,size 是要读取的字节数,buffer 是一个缓冲区对象。该函数返回读取的字节数。

例如:

with open('file.bin', 'rb') as f:
    buffer = bytearray(16)
    num_bytes_read = f.readinto(buffer)
    print(buffer)

该代码将读取文件的前 16 个字节,并将其存储在缓冲区中。

三、读取文件结构

有时,二进制文件中的数据具有特定的结构,例如,头信息、数据块等。在这种情况下,需要读取文件结构中的数据。

可以使用 struct 模块读取二进制数据。struct 模块使用 format 字符串指定如何读取数据,并返回一个元组,元组中的每个元素都是读取的数据。

例如:

import struct

with open('file.bin', 'rb') as f:
    # 读取文件头
    header = f.read(4) # 假设头数据需要4个字节

    # 读取数据块
    data = bytearray(16)
    f.readinto(data)

    # 读取结构体
    fmt = '<3i' # 假设结构体元素是3个32位整数
    buf = f.read(struct.calcsize(fmt))
    struct_data = struct.unpack(fmt, buf)

在此示例中,使用 f.read() 读取文件头和数据块,使用 f.readinto() 将数据块存储在缓冲区中,并使用 struct.unpack() 对二进制数据进行解包。

注意事项:

  1. 在 Python 中读取二进制文件时,必须使用二进制读写模式(’rb’)。
  2. 如果文件模式为 ‘r’,则将文件视为一个文本文件,而不是二进制文件。
  3. 读取二进制文件时,必须指定要读取的字节数,否则将读取整个文件。
  4. 使用 readinto() 函数时,必须为缓冲区分配足够的空间,以便存储要读取的数据。
  5. 如果二进制数据具有特定的结构,则可以使用 struct 模块读取数据,并将其转换为 Python 对象。格式字符串应与文件中的数据格式匹配。

总结:

本文介绍了如何在 Python 中读取二进制文件,包括打开文件、读取二进制数据和读取文件结构。要读取二进制文件,必须使用二进制读写模式(’rb’)。可以使用 read() 或 readinto() 函数从文件中读取数据。如果二进制数据具有特定的结构,则可以使用 struct 模块读取数据,并将其转换为 Python 对象。使用二进制读写文件时,务必小心处理数据,以防止意外修改文件中的数据。