如何在Python中解压Zip归档文件时保留文件权限模式?
保留Zip归档文件权限的Python内置方法
默认情况下,zipfile.ZipFile.extractall()和shutil.unpack_archive()会忽略Zip文件中存储的Unix执行权限,将提取后的文件权限统一设为100644(即0o644)。但可以通过手动读取Zip归档中的权限信息,在提取后恢复原权限,无需依赖subprocess调用外部unzip命令。
实现步骤
- 遍历Zip归档中的每个文件条目
- 提取文件到目标目录
- 从条目的
external_attr属性中读取原始Unix权限(该属性的高16位存储Unix权限信息) - 用
os.chmod()为提取后的文件设置原权限
代码示例
import zipfile import os def extract_zip_preserve_permissions(zip_file_path, target_dir): with zipfile.ZipFile(zip_file_path, 'r') as zip_ref: for entry in zip_ref.infolist(): # 提取当前条目到目标目录 zip_ref.extract(entry, target_dir) entry_path = os.path.join(target_dir, entry.filename) # 仅处理文件(目录权限可根据需求自行调整) if not entry.is_dir(): # 提取Unix权限(external_attr的高16位) original_perms = entry.external_attr >> 16 if original_perms != 0: os.chmod(entry_path, original_perms)
使用方式
调用上述函数即可完成带权限保留的解压:
extract_zip_preserve_permissions("your_archive.zip", "extracted_folder")
说明
shutil.make_archive创建Zip归档时,已经将文件的Unix权限信息存储在条目的external_attr中,因此提取时只需读取该值即可恢复权限- 若需要处理目录权限,可去掉
if not entry.is_dir()的判断,直接为目录设置原权限(注意目录通常需要执行权限才能进入)
内容的提问来源于stack exchange,提问作者Patrick Kwok
相关产品推荐
相关产品推荐

