Python读写二进制文件与字节数据处理详解

听雨眠
听雨眠
发布时间:2026-10-11| 2人浏览过
原创

在Python开发中,处理非文本数据(如图片、音频或自定义协议)时,必须使用二进制模式。本文解析如何正确读写字节数据,对比文本与字节在索引和迭代上的差异,并介绍利用数组和readinto提升I/O效率的技巧。

二进制文件读写基础

读写二进制文件的核心在于使用 open() 函数并指定正确的模式。读取时使用 'rb',写入时使用 'wb'。与文本模式不同,二进制模式下返回的数据是字节字符串(bytes)格式,写入时参数必须是暴露字节数据的对象。

# 读取整个文件为单个字节字符串
with open('somefile.bin', 'rb') as f:
  data = f.read()

# 写入二进制数据到文件
with open('somefile.bin', 'wb') as f:
  f.write(b'Hello World')

字节字符串与文本字符串的差异

理解字节(bytes)与文本(str)的区别至关重要。在文本字符串中,索引和迭代返回的是字符;而在字节字符串中,它们返回的是字节的整数值(0-255)。

>>> # 文本字符串
>>> t = 'Hello World'
>>> t[0]
'H'
>>> for c in t:
...   print(c)
...
H
e
l
l
o
...
>>> # 字节字符串
>>> b = b'Hello World'
>>> b[0]
72
>>> for c in b:
...   print(c)
...
72
101
108
108
111
...

这种差异意味着在处理二进制数据时,不能直接进行字符级操作,而应关注字节值。若需处理文本数据,必须在读写前进行显式的编码(encode)和解码(decode)操作。

with open('somefile.bin', 'rb') as f:
  data = f.read(16)
  text = data.decode('utf-8')

with open('somefile.bin', 'wb') as f:
  text = 'Hello World'
  f.write(text.encode('utf-8'))

高效写入:数组与C结构体

对于结构化数据,如数值数组或C语言结构体,可以直接写入二进制文件,无需手动序列化。这要求对象实现缓冲接口(Buffer Protocol)。

import array
nums = array.array('i', [1, 2, 3, 4])
with open('data.bin','wb') as f:
  f.write(nums)

这种方法直接写入内存中的二进制表示,适用于实现缓冲接口的对象。需要注意的是,直接写入具有平台相关性,结果可能依赖于系统的字长和字节顺序(Endianness)。

高性能读取:readinto方法

当需要频繁读取小数据块或处理大文件时,readinto() 方法是更优的选择。它允许直接将数据读取到预分配的内存缓冲区中,避免了额外的内存分配和复制开销。

>>> import array
>>> a = array.array('i', [0, 0, 0, 0, 0, 0, 0, 0])
>>> with open('data.bin', 'rb') as f:
...   f.readinto(a)
...
16
>>> a
array('i', [1, 2, 3, 4, 0, 0, 0, 0])

在上述示例中,readinto() 返回读取的字节数(16),并将文件内容直接填充到数组 a 中。这种方式在高性能网络协议解析或二进制文件格式处理中非常实用。

注意事项与最佳实践

  1. 编码处理: 读写文本数据前必须进行解码和编码操作,否则会导致 UnicodeDecodeError 或数据损坏。
  2. 平台相关性: 直接写入数组或结构体时,需确保读写双方具有相同的字节顺序和字长,否则数据解析将出错。
  3. 内存管理: 使用 readinto() 时,预分配缓冲区的大小应合理,以避免内存浪费或数据截断。

以上就是Python如何读写字节数据的详细内容,更多关于Python二进制文件处理、文件读写技巧的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。