rarfile 是一个第三方库,它允许你在 Python 中像处理普通文件一样读取、创建和解压 RAR 档案,它本身是一个“外壳”,底层的解压工作需要依赖一个命令行工具,通常是 UnRAR。

安装 rarfile 和依赖
第一步:安装 rarfile 库
使用 pip 进行安装:
pip install rarfile
第二步:安装并配置 UnRAR 工具 (最关键的一步)
rarfile 必须调用系统中的 unrar 命令才能工作,你需要根据你的操作系统安装它。
对于 Windows:
- 从 RARLAB 官网 下载
UnRAR for Windows。 - 下载后解压,你会得到
UnRAR.exe文件。 - 最重要的一步:将
UnRAR.exe所在的目录添加到系统的PATH环境变量中,这样 Python 才能找到它。- 右键“此电脑” -> “属性” -> “高级系统设置” -> “环境变量”。
- 在“系统变量”中找到
Path,点击“编辑”。 - 点击“新建”,然后将
UnRAR.exe的完整路径(C:\Program Files\WinRAR)添加进去。 - 重启命令提示符或你的 IDE。
对于 macOS (使用 Homebrew):

brew install unrar
Homebrew 会自动处理好路径。
对于 Linux (Debian/Ubuntu):
sudo apt-get update sudo apt-get install unrar
或者如果你的包管理器叫 unrar-free (一个开源实现):
sudo apt-get install unrar-free
基本用法
安装完成后,你就可以在 Python 中导入并使用 rarfile 了。
1 打开 RAR 文件
使用 rarfile.RarFile() 函数来打开一个 RAR 文件,它会返回一个类似文件对象的 RarFile 实例。
import rarfile
# 确保文件存在
rar_path = 'example.rar'
try:
# 以只读模式打开 RAR 文件
with rarfile.RarFile(rar_path, 'r') as rf:
print(f"成功打开 RAR 文件: {rar_path}")
# 后续操作 rf 对象...
except rarfile.BadRarFile:
print(f"错误: 文件 '{rar_path}' 不是有效的 RAR 文件或已损坏。")
except FileNotFoundError:
print(f"错误: 文件 '{rar_path}' 未找到。")
2 列出 RAR 文件中的内容
使用 namelist() 方法可以获取 RAR 文件中所有文件的列表。
import rarfile
with rarfile.RarFile('example.rar', 'r') as rf:
# 获取所有文件和文件夹的列表
file_list = rf.namelist()
print("RAR 文件内容列表:")
for name in file_list:
print(name)
输出示例:
RAR 文件内容列表:
docs/
docs/report.txt
images/
images/logo.png
3 检查特定文件是否存在
使用 getinfo() 方法可以获取单个文件的信息,如果文件不存在会抛出 KeyError。
import rarfile
with rarfile.RarFile('example.rar', 'r') as rf:
try:
info = rf.getinfo('docs/report.txt')
print(f"找到文件: {info.filename}")
print(f"文件大小: {info.file_size} 字节")
print(f"压缩后大小: {info.compress_size} 字节")
print(f"最后修改时间: {info.date_time}")
except KeyError:
print("文件 'docs/report.txt' 不在 RAR 档案中。")
4 解压单个文件
使用 extract() 方法可以将指定的单个文件解压到当前目录或指定的目标目录。
import rarfile
# 解压到当前目录
with rarfile.RarFile('example.rar', 'r') as rf:
try:
rf.extract('images/logo.png')
print("文件 'images/logo.png' 已解压到当前目录。")
except KeyError:
print("要解压的文件不存在。")
# 解压到指定目录
output_dir = 'unzipped_files'
with rarfile.RarFile('example.rar', 'r') as rf:
rf.extract('images/logo.png', path=output_dir)
print(f"文件 'images/logo.png' 已解压到目录 '{output_dir}'。")
5 解压整个 RAR 文件
使用 extractall() 方法可以一次性解压 RAR 文件中的所有内容。
import rarfile
import os
# 创建一个用于解压的目录
output_dir = 'all_unzipped_files'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
with rarfile.RarFile('example.rar', 'r') as rf:
rf.extractall(path=output_dir)
print(f"所有文件已解压到目录 '{output_dir}'。")
高级用法
1 处理加密的 RAR 文件
RAR 文件设置了密码,你需要在打开 RarFile 时提供 pwd 参数。
import rarfile
password = b'my_secret_password' # 密码必须是 bytes 类型
with rarfile.RarFile('encrypted.rar', 'r', pwd=password) as rf:
file_list = rf.namelist()
print("加密 RAR 文件内容列表:")
for name in file_list:
print(name)
# 解压加密文件
rf.extractall(path='decrypted_files')
print("已解压加密文件到 'decrypted_files' 目录。")
注意:
- 密码必须是
bytes类型,如果你的密码是字符串,请使用password.encode()进行转换。 - 如果密码错误,解压时会抛出
rarfile.BadRarFile异常。
2 创建 RAR 文件
rarfile 库主要用于读取 RAR 文件,创建 RAR 文件的功能非常有限,通常不推荐使用,对于创建压缩文件,建议使用 Python 内置的 zipfile 库(用于创建 ZIP 文件)或调用 rar 命令行工具(如果已安装)。
常见问题与解决方案
Q1: rarfile.NeedFirstVolume 错误
原因: 你尝试打开的是一个分卷压缩包(part1.rar, part2.rar...),但你只提供了第一个文件。
解决方案: 确保所有分卷文件都在同一个目录下,然后只打开第一个文件(part1.rar)。rarfile 会自动找到其他分卷。
# 错误
# with rarfile.RarFile('data.part2.rar', 'r') as rf: ...
# 正确
with rarfile.RarFile('data.part1.rar', 'r') as rf:
rf.extractall('extracted_data')
Q2: rarfile.BadRarFile 错误
原因:
- 文件不是有效的 RAR 格式。
- 文件已损坏。
- 密码错误(对于加密文件)。
UnRAR工具未正确安装或不在PATH中。
解决方案:
- 用 WinRAR 或其他解压工具手动打开该文件,看是否能正常解压。
- 重新下载或获取一个完好的 RAR 文件。
- 检查密码是否正确,并确保以
bytes类型传入。 - 再次确认
UnRAR(或unrar) 是否已安装并添加到系统PATH,可以在终端/命令行中直接输入unrar或UnRAR来测试。
Q3: FileNotFoundError: [Errno 2] No such file or directory: 'unrar'
原因: Python 找不到底层的 unrar 命令行工具。
解决方案: 仔细按照 第一步:安装 rarfile 和依赖 中的说明,确保在你的操作系统上正确安装了 UnRAR 并配置了环境变量 PATH。
| 功能 | 方法 | 说明 |
|---|---|---|
| 打开文件 | rarfile.RarFile(filename, 'r') |
必须在 with 语句中使用,确保文件正确关闭。 |
rf.namelist() |
返回包含所有文件和目录路径的字符串列表。 | |
| 获取文件信息 | rf.getinfo(filename) |
返回一个 RarInfo 对象,包含大小、时间等元数据。 |
| 解压单个文件 | rf.extract(filename, path=None) |
path 参数指定解压目录,默认为当前目录。 |
| 解压全部文件 | rf.extractall(path=None) |
path 参数指定解压目录,默认为当前目录。 |
| 处理密码 | rarfile.RarFile(filename, 'r', pwd=password) |
pwd 必须是 bytes 类型。 |
rarfile 是一个功能强大且易于使用的库,是 Python 中处理 RAR 文件的绝佳选择,只要成功配置好 UnRAR 依赖,你就可以轻松地集成 RAR 文件处理功能到你的 Python 项目中。
