在Python中实现文件压缩与解压缩,是处理大数据和优化存储空间的常用手段。Python提供了多种库来支持这一功能,其中最为常用的是zlib
、gzip
、bz2
、zipfile
以及第三方库如rarfile
(针对RAR格式,尽管不是Python标准库)和pyzipper
(支持AES加密的zip文件)。这里,我们将重点介绍gzip
和zipfile
两个库的使用,因为它们在处理常见压缩文件时非常高效且易于使用。
使用gzip进行文件压缩与解压缩
gzip
是Python标准库之一,主要用于单个文件的压缩和解压缩,生成的压缩文件以.gz
为后缀。它基于DEFLATE算法,适用于文本文件和二进制文件的压缩。
压缩文件
要使用gzip
压缩文件,可以打开源文件,然后使用gzip.open
以写入模式('wb'
)打开一个新的压缩文件,并将源文件的内容写入到压缩文件中。
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'
)打开压缩文件,并读取其内容,然后可以将这些内容写入到一个新的未压缩文件中。
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归档中。
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
方法解压。
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编程之旅!