python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python二进制文件读写

Python进阶指南之二进制文件读写机制与应用详解

作者:知远漫谈

在现代编程世界中,二进制文件的处理是每个开发者必须掌握的核心技能之一,本文从二进制文件本质讲起,手把手教你用Pillow和pydub库实现图片像素操作、格式转换和音频裁剪、合并等实用功能,希望对大家有所帮助

在现代编程世界中,二进制文件的处理是每个开发者必须掌握的核心技能之一。无论是图像、音频还是视频,它们本质上都是以二进制形式存储的数据。而作为一门强大且灵活的编程语言,Python 提供了丰富的工具来读取、写入和操作这些复杂的二进制数据。

今天,我们将深入探索 二进制文件的读写机制,并聚焦于两个典型应用场景:图片处理音频文件操作。通过实际代码示例,你将学会如何用 Python 高效地处理多媒体内容,甚至实现一些有趣的功能,比如自动调整图片尺寸、提取音频特征、合并多个音频片段等。

本文适合有一定 Python 基础(如变量、函数、类)的开发者,目标是帮助你从“会用”走向“精通”。我们不会停留在表面语法,而是深入底层逻辑,理解“为什么这么做”。

什么是二进制文件?它和文本文件有什么区别?

在计算机中,所有数据最终都以二进制格式(0 和 1 的组合)存在。但根据用途不同,我们可以将其分为两类:

特性文本文件(Text File)二进制文件(Binary File)
存储内容可读字符(如字母、数字)机器码、图像像素、音频采样点等
编码方式UTF-8, ASCII 等无固定编码规则
是否可直接阅读✅ 是(人类可读)❌ 否(需特定软件打开)
示例.txt, .py, .json.jpg, .mp3, .exe, .pdf

举个例子:一个 .jpg 图片文件虽然名字是“图片”,但在硬盘上其实是一串由 0 和 1 构成的数字流。我们不能像看 .txt 文件那样直接用记事本打开它——因为那不是“文本”,而是“二进制指令”。

二进制文件的本质

二进制文件的核心在于:数据结构的组织方式。比如:

因此,要正确读写这些文件,就必须了解其内部格式(即“文件头”、“元数据”、“数据体”等结构)。

如何用 Python 读写二进制文件?

Python 提供了 open() 函数的 mode='rb'(读取二进制)和 mode='wb'(写入二进制)模式,这是处理二进制文件的基础。

基础语法:打开二进制文件

# 1. 读取二进制文件
with open("example.bin", "rb") as f:
    data = f.read()
    print(f"读取到 {len(data)} 字节")

# 2. 写入二进制文件
with open("output.bin", "wb") as f:
    f.write(b'\x01\x02\x03\x04')  # 写入四个字节

注意:b'' 表示字节字符串(bytes literal),不同于普通字符串 "..."

重要概念:bytesvsstr

类型说明适用场景
str字符串,用于文本处理显示、拼接、解析文本
bytes二进制数据,不可变序列读写文件、网络传输、加密解密
text = "Hello"
binary_data = text.encode('utf-8')  # str → bytes
print(binary_data)  # b'Hello'

decoded_text = binary_data.decode('utf-8')  # bytes → str
print(decoded_text)  # Hello

推荐使用 encode() / decode() 方法进行编码转换,避免乱码!

图片处理:从二进制到像素级操作

使用 Pillow 库处理图片(推荐)

Pillow(PIL 的现代分支)是目前最流行的 Python 图像处理库,支持多种格式(JPEG、PNG、GIF、BMP 等),并且能轻松读取/写入二进制数据。

安装 Pillow(如果未安装)

pip install pillow

读取图片为二进制流

from PIL import Image
import io

# 打开一张图片并转为字节流
image_path = "cat.jpg"
with open(image_path, "rb") as f:
    image_bytes = f.read()

# 将字节流加载为 PIL 图像对象
image = Image.open(io.BytesIO(image_bytes))

print(f"图片尺寸: {image.size}")
print(f"模式: {image.mode}")  # RGB, RGBA, L 等

io.BytesIO 是一个内存中的“文件对象”,可以让我们把字节数据当作文件来读取。

修改图片并保存为二进制

# 调整大小
resized_image = image.resize((300, 300))

# 保存为字节流
output_buffer = io.BytesIO()
resized_image.save(output_buffer, format="JPEG", quality=90)

# 获取二进制数据
modified_bytes = output_buffer.getvalue()

# 保存到新文件
with open("resized_cat.jpg", "wb") as f:
    f.write(modified_bytes)

这种方式特别适合在服务器端动态生成缩略图、压缩图片或上传前预处理。

图像像素级操作(高级技巧)

我们可以直接访问图像的像素数据,进行深度处理。

from PIL import Image

# 打开图像
img = Image.open("landscape.jpg")
pixels = img.load()  # 获得像素访问器

width, height = img.size

# 案例:将图像转为灰度图(仅保留亮度信息)
gray_img = Image.new("L", (width, height))
gray_pixels = gray_img.load()

for x in range(width):
    for y in range(height):
        r, g, b = pixels[x, y]
        # 灰度公式:Y = 0.299R + 0.587G + 0.114B
        gray_value = int(0.299 * r + 0.587 * g + 0.114 * b)
        gray_pixels[x, y] = gray_value

# 保存结果
gray_img.save("gray_landscape.jpg", "JPEG")

你还可以尝试添加滤镜、边缘检测、模糊、锐化等效果,只需修改像素值即可!

图像格式转换(批量处理)

有时我们需要批量转换图片格式,例如将所有 .png 转为 .webp

from PIL import Image
import os

input_dir = "images/"
output_dir = "converted/"

os.makedirs(output_dir, exist_ok=True)

for filename in os.listdir(input_dir):
    if filename.lower().endswith(".png"):
        input_path = os.path.join(input_dir, filename)
        output_path = os.path.join(output_dir, filename.replace(".png", ".webp"))

        with Image.open(input_path) as img:
            img.save(output_path, "WEBP", quality=85)
        
        print(f"✅ 已转换: {filename} → {os.path.basename(output_path)}")

这种脚本可用于网站资源优化、自动化部署等场景。

音频文件处理:从二进制到声音分析

使用 pydub 处理音频

Pydub 是一个强大的音频处理库,基于 FFmpeg 构建,支持几乎所有常见音频格式(MP3、WAV、FLAC、OGG 等)。

安装 pydub

pip install pydub

注意:需要安装 FFmpeg 才能正常使用。

读取音频文件为二进制数据

from pydub import AudioSegment
import io

# 读取音频文件为二进制
audio_path = "music.mp3"

# 1. 读取原始字节
with open(audio_path, "rb") as f:
    raw_data = f.read()

# 2. 使用 pydub 从字节创建音频段
audio_segment = AudioSegment.from_file(io.BytesIO(raw_data), format="mp3")

print(f"音频时长: {len(audio_segment)} ms")
print(f"采样率: {audio_segment.frame_rate} Hz")
print(f"声道数: {audio_segment.channels}")

AudioSegment 是 pydub 的核心类,表示一段音频。

常见音频操作

1. 裁剪音频(截取某一段)

# 截取第 10 秒到第 15 秒
start_ms = 10_000
end_ms = 15_000
cropped_audio = audio_segment[start_ms:end_ms]

# 保存裁剪后的音频
cropped_audio.export("trimmed.mp3", format="mp3")

2. 合并多个音频片段

# 加载多个音频文件
intro = AudioSegment.from_file("intro.mp3", format="mp3")
main = AudioSegment.from_file("main.wav", format="wav")
outro = AudioSegment.from_file("outro.mp3", format="mp3")

# 拼接
final_audio = intro + main + outro

# 导出
final_audio.export("combined.mp3", format="mp3")

适用于制作播客、短视频配音、音乐混音等。

3. 调整音量(增益)

# 提高音量 10dB
louder_audio = audio_segment + 10  # 增益 +10dB

# 降低音量 5dB
quieter_audio = audio_segment - 5

# 保存
quieter_audio.export("quiet.mp3", format="mp3")

音频特征提取(进阶)

你可以用 pydub 结合 numpy 来提取音频的波形数据,进行更深入分析。

import numpy as np

# 将音频转换为 numpy 数组
samples = np.array(audio_segment.get_array_of_samples())

print(f"样本总数: {len(samples)}")
print(f"最大振幅: {np.max(np.abs(samples))}")

# 绘制波形图(需 matplotlib)
import matplotlib.pyplot as plt

plt.figure(figsize=(12, 4))
plt.plot(samples[:1000])  # 只显示前1000个样本
plt.title("音频波形图")
plt.xlabel("时间点(采样索引)")
plt.ylabel("振幅")
plt.grid(True)
plt.show()

这是语音识别、音乐分类、声纹分析等 AI 任务的基础步骤!

二进制数据的高级操作技巧

二进制文件分块读取(大文件处理)

对于超大文件(如 1GB 的视频),一次性读入内存会崩溃。应采用分块读取策略。

def read_large_binary_file(filename, chunk_size=8192):
    with open(filename, "rb") as f:
        while True:
            chunk = f.read(chunk_size)
            if not chunk:
                break
            yield chunk  # 逐块返回

# 使用生成器处理大文件
for chunk in read_large_binary_file("huge_video.mp4", chunk_size=4096):
    # 可以在这里做校验、压缩、加密等
    process_chunk(chunk)

生成器 yield 让内存占用保持在常数级别,适合处理 GB 级别文件。

二进制数据加密(基础示例)

我们可以对二进制文件进行简单加密,防止泄露。

from cryptography.fernet import Fernet

# 1. 生成密钥(仅一次)
key = Fernet.generate_key()
cipher = Fernet(key)

# 2. 加密文件
with open("secret.txt", "rb") as f:
    plaintext = f.read()

encrypted_data = cipher.encrypt(plaintext)

# 3. 保存加密后的内容
with open("secret_encrypted.bin", "wb") as f:
    f.write(encrypted_data)

print("✅ 文件已加密!请妥善保管密钥。")

安全提示:不要将密钥硬编码在代码中。建议使用环境变量或密钥管理服务。

Mermaid 流程图:图像处理工作流

此图展示了典型的图片处理流程:从二进制输入 → 处理 → 输出二进制。

Mermaid 流程图:音频处理流水线

该流程图清晰展示了音频处理的通用范式,适用于自动化任务。

总结:二进制文件处理的关键要点

技能说明推荐工具
读写二进制文件必须使用 'rb' / 'wb' 模式open() + bytes
图像处理支持多种格式,可像素级操作Pillow
音频处理支持跨格式转换,可分析波形pydub + numpy
大文件处理避免内存溢出生成器 + 分块读取
数据安全保护敏感二进制数据cryptography

实际项目应用建议

  1. Web 服务:用户上传图片 → 服务器自动压缩 + 生成缩略图 → 返回二进制流
  2. AI 项目:从音频文件中提取 MFCC 特征 → 用于语音识别模型训练
  3. 自动化工具:批量转换 PDF/图片/音频格式,提升工作效率
  4. 备份系统:加密二进制数据后存储,确保安全性

最后提醒

当你掌握了二进制文件的读写与多媒体处理,你就真正迈入了 Python 高级开发的大门。不再只是“写脚本”,而是能构建真实可用的系统

无论你是想做一个智能相册、语音助手,还是一个在线音视频编辑平台,今天的知识都将成为你的坚实基石。

到此这篇关于Python进阶指南之二进制文件读写机制与应用详解的文章就介绍到这了,更多相关Python二进制文件读写内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文