Python中的二进制文件

2025年1月5日 | 阅读 7 分钟

二进制文件是包含二进制格式数据的计算机文件。数据表示为一系列字节,每个字节长八位。要解释二进制文件的内容,必须使用能够理解内容格式和如何读取数据的程序或硬件处理器。二进制文件包括许多文件类型,例如可执行文件、库、图形、数据库、存档等。

Binary Files in Python

Python 中的二进制文件以不供人类阅读的格式存储数据。这些文件可以包含各种类型的数据,例如图像、音频、视频、压缩存档或任何非纯文本格式的数据。在 Python 中处理二进制文件需要以原始字节的形式读取和写入数据。

创建二进制文件

与文本文件不同,创建二进制文件需要以人类无法读取的格式写入数据。使用 Python 等编程语言可以轻松创建二进制文件。这是一个简单的 Python 示例。

程序

输出

Binary file has been created successfully.

说明

  • with open ('example.bin', 'wb') as binary_file:
  • 此行以二进制写入模式('wb')打开一个名为 'example.bin' 的文件。此处使用 with 语句可确保在写入后正确关闭文件。
  • [0x48, 0x65, 0x6C, 0x6C, 0x6F]。这些十六进制值代表 ASCII 字符“Hello”。
  • 此行将二进制数据(“Hello”的 ASCII 值)写入前面打开的二进制文件。

注意:如果您想在特定文件夹中创建二进制文件,请复制路径并将其替换为 C:/Users/HP/OneDrive/Desktop/example.bin' 而不是 example.bin。

代码行如下所示

with open('C:/Users/HP/OneDrive/Desktop/example.bin', 'wb') as binary_file

打开二进制文件

要处理二进制文件,请使用相应的文件模式:“rb”用于读取二进制文件,“wb”用于写入二进制文件。

读取二进制文件

在 Python 中,打开二进制文件进行读取时,请使用专门为二进制数据设计的“rb”模式。这是一个简单的示例

程序

输出

b'Hello'

说明

前面的代码只是以“rb”模式打开文件进行读取,并将文件中的数据保存在 binary_data 中。然后使用 print 语句打印数据。

写入二进制文件

在 Python 中,打开二进制文件进行写入时,请使用专门为二进制数据设计的“wb”模式。这是一个简单的示例程序。

程序

输出

data has been successfully written into the file

说明

在此示例中

  • 'example.bin' 是您要打开或创建的二进制文件的名称。
  • 'wb' 表示您正在以二进制数据的写入模式打开文件。
  • binary_file.write(binary_data) 行将二进制数据(b'\x48\x65\x6C\x6C\x6F')写入二进制文件。

追加二进制数据

程序

输出

data is successfully written into the file

说明

  • binary_data_to_append = b'\x57\x6F\x72\x6C\x64'
    • 此行创建一个名为 binary_data_to_append 的字节对象,其中包含 ASCII 字符“World”的二进制表示。序列中的每个十六进制值对应于字符的 ASCII 码。
  • with open('example.bin', 'ab') as binary_file:
    • 此行以二进制数据的追加模式('ab')打开名为 'example.bin' 的文件。
    • 如果文件存在,光标将定位在文件末尾。
    • 如果文件不存在,将创建一个新文件。
  • binary_file.write(binary_data_to_append)
    • 此行将二进制数据(binary_data_to_append)写入文件末尾。
  • print("Data is successfully written into the file")
    • 此行打印一条消息,指示数据已成功写入文件

注意

请注意,两个文件操作之间存在重要区别:追加和写入。

“写入”操作将擦除文件中的任何现有内容,并在文件已存在时从开头开始写入。另一方面,“追加”操作会将光标移到文件末尾,并添加新内容而不会擦除任何内容。

因此,如果您想保留文件中的现有内容并添加新内容,则应使用“追加”操作。但是,如果您从头开始,并在写入新内容之前擦除文件中的所有内容,则应使用“写入”操作。

定位和读取特定位置

  • 使用 seek 方法将文件光标移动到特定位置,然后从该位置读取。

程序

输出

b'orl'

说明

with open('example.bin', 'rb') as binary_file:

此行以二进制读取模式('rb')打开名为 'example.bin' 的文件。with 语句用于确保在执行代码块后正确关闭文件。

binary_file.seek(5)

此行使用 seek 方法将文件光标移动到文件中的第 5 个字节。

seek 方法用于在文件内定位光标。在这种情况下,它会将光标从文件开头移动五个字节。

data = binary_file.read(3)

此行从文件光标的当前位置读取 3 个字节。

read 方法从光标的当前位置读取指定数量的字节。在这种情况下,它从第 5 个字节开始读取 3 个字节。

用于二进制数据结构的 struct 模块

struct 模块可用于打包和解包二进制数据结构。它确保数据格式正确,以在不同平台之间保持一致性。

pack 函数将格式字符串和一组值转换为打包的二进制字符串。另一方面,unpack 函数接受格式字符串和打包的二进制字符串,并返回一个包含解包值的元组。格式字符串由格式代码组成,这些代码表示每个值的类型和大小。

格式代码

整数格式

  • I 或 i:无符号或有符号整数(4 字节)
  • H 或 h:无符号或有符号短整数(2 字节)
  • L 或 l:无符号或有符号长整数(4 字节)
  • Q 或 q:无符号或有符号长长整数(8 字节)

浮点格式

  • f:单精度浮点数(4 字节)
  • d:双精度浮点数(8 字节)

字符格式

  • c:字符(1 字节)
  • s:字符串(可变长度)

示例

这是一个使用 struct 模块打包数据的示例程序

程序

输出

b'*\x00\x00\x00\xc3\xf5H@\x07\x00'

说明

该程序使用 struct.pack 方法成功将数据打包为二进制格式,然后将打包的数据保存到名为 'binary_data.bin' 的二进制文件中。该文件中存储的二进制数据的十六进制表示形式为 (b'*x00x00x00xc3xf5H@x07x00')。

让我们分解一下输出

  • b'*':前四个字节以小端格式表示无符号整数 42(* 是 42 的十六进制 ASCII 表示)。
  • \x00\x00\x00:接下来的四个字节以小端格式表示单精度浮点数 3.14。
  • \xc3\xf5H@:最后两个字节以小端格式表示短整数 7。

使用 struct 模块解包数据

示例

这是一个解包文件中数据的简单程序。

程序

输出

(42, 3.140000104904175, 7)

说明

struct.unpack 函数根据打包过程中使用的格式字符串(我们使用了 Ifh 格式)将二进制数据转换回其原始值。

结论

由于二进制文件不可读,因此它们需要 Python 中的专门处理。处理二进制文件时,使用正确的模式至关重要,例如“rb”用于读取,“wb”用于写入,“ab”用于追加。read() 方法用于从二进制文件读取,允许检索完整内容或定义数量的字节。write() 方法用于向二进制文件写入,并且数据必须表示为字节。struct 模块在处理结构化二进制数据时非常有用,它提供用于打包和解包数据的函数,以确保跨平台的一致性。此模块对于处理二进制数据结构、确保格式正确和兼容性非常有用。无论您是存储照片、音频还是视频,理解 Python 中二进制文件操作的复杂性对于有效的数据操作都至关重要。


下一个主题Bloom-filter-in-python