当前位置: 技术文章>> 如何用 Python 实现文件压缩和解压缩?
文章标题:如何用 Python 实现文件压缩和解压缩?
在Python中实现文件压缩与解压缩,是处理大数据和优化存储空间的常用手段。Python提供了多种库来支持这一功能,其中最为常用的是`zlib`、`gzip`、`bz2`、`zipfile`以及第三方库如`rarfile`(针对RAR格式,尽管不是Python标准库)和`pyzipper`(支持AES加密的zip文件)。这里,我们将重点介绍`gzip`和`zipfile`两个库的使用,因为它们在处理常见压缩文件时非常高效且易于使用。
### 使用gzip进行文件压缩与解压缩
`gzip`是Python标准库之一,主要用于单个文件的压缩和解压缩,生成的压缩文件以`.gz`为后缀。它基于DEFLATE算法,适用于文本文件和二进制文件的压缩。
#### 压缩文件
要使用`gzip`压缩文件,可以打开源文件,然后使用`gzip.open`以写入模式(`'wb'`)打开一个新的压缩文件,并将源文件的内容写入到压缩文件中。
```python
import gzip
def gzip_compress(input_filepath, output_filepath):
"""
使用gzip压缩文件
:param input_filepath: 源文件路径
:param output_filepath: 压缩后文件路径
"""
with open(input_filepath, 'rb') as f_in:
with gzip.open(output_filepath, 'wb') as f_out:
f_out.writelines(f_in)
# 示例用法
gzip_compress('example.txt', 'example.txt.gz')
```
#### 解压缩文件
解压缩过程与压缩类似,但方向相反。使用`gzip.open`以读取模式(`'rb'`)打开压缩文件,并读取其内容,然后可以将这些内容写入到一个新的未压缩文件中。
```python
def gzip_decompress(input_filepath, output_filepath):
"""
使用gzip解压缩文件
:param input_filepath: 压缩文件路径
:param output_filepath: 解压缩后文件路径
"""
with gzip.open(input_filepath, 'rb') as f_in:
with open(output_filepath, 'wb') as f_out:
f_out.writelines(f_in)
# 示例用法
gzip_decompress('example.txt.gz', 'example_decompressed.txt')
```
### 使用zipfile进行文件压缩与文件夹压缩
`zipfile`库提供了对ZIP归档文件的读写支持,它既可以用来压缩单个文件,也可以用来将整个文件夹及其内容压缩成一个ZIP文件。
#### 压缩文件或文件夹
要压缩文件或文件夹,首先需要将想要压缩的项(文件或文件夹路径)列出来,然后使用`zipfile.ZipFile`以写入模式(`'w'`)打开一个新的ZIP文件,并将这些项添加到ZIP归档中。
```python
import zipfile
import os
def zip_files(file_or_folder_paths, zip_output_path):
"""
将文件或文件夹压缩为ZIP文件
:param file_or_folder_paths: 要压缩的文件或文件夹路径列表
:param zip_output_path: 输出的ZIP文件路径
"""
with zipfile.ZipFile(zip_output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
for path in file_or_folder_paths:
if os.path.isdir(path):
for root, dirs, files in os.walk(path):
for file in files:
zipf.write(os.path.join(root, file),
arcname=os.path.relpath(os.path.join(root, file),
os.path.commonprefix((root, path))))
else:
zipf.write(path, arcname=os.path.basename(path))
# 示例用法
zip_files(['folder_to_compress', 'example.txt'], 'output.zip')
```
注意:在压缩文件夹时,`os.walk`用于遍历文件夹中的所有文件和子文件夹,`zipf.write`的第二个参数`arcname`用于指定压缩包中的文件名,确保文件在ZIP归档中保持正确的结构。
#### 解压ZIP文件
解压ZIP文件相对简单,只需使用`zipfile.ZipFile`以读取模式(`'r'`)打开ZIP文件,然后使用`extractall`或`extract`方法解压。
```python
def unzip_file(zip_filepath, extract_to_path):
"""
解压ZIP文件到指定目录
:param zip_filepath: ZIP文件路径
:param extract_to_path: 解压到的目标目录
"""
with zipfile.ZipFile(zip_filepath, 'r') as zip_ref:
zip_ref.extractall(extract_to_path)
# 示例用法
unzip_file('output.zip', 'extracted_files')
```
### 注意事项
- 在处理大文件或大量文件时,注意内存和磁盘空间的使用情况。
- 压缩和解压缩过程中可能会遇到文件权限问题,确保程序有足够的权限访问和操作这些文件。
- 对于涉及敏感信息的文件,考虑使用加密压缩方式(如`pyzipper`支持的AES加密ZIP文件)。
### 码小课网站相关
在`码小课`网站上,我们提供了丰富的Python编程教程,包括但不限于文件处理、数据压缩与解压缩等主题。我们致力于通过深入浅出的讲解和丰富的实例代码,帮助编程爱好者及专业人士快速掌握Python编程技能。无论你是初学者还是有一定基础的进阶者,都能在`码小课`找到适合自己的学习资源。欢迎访问我们的网站,开启你的Python编程之旅!