You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:22:31