python处理【orc】下载压缩的.zip文件,windows和linux同时适配

一. 前言

在Python中处理ZIP文件时,要实现Windows和Linux的跨平台适配问题。

二. 代码

python 复制代码
import os
import zipfile
from pathlib import Path
import re


def extract_preserve_structure(zip_path: str, extract_to: str):
    """
    解压 ZIP,自动剥离绝对路径前缀,保留任务目录下的完整子结构。
    假设有效内容位于某个纯数字目录(如 123/)之下。
    """
    with zipfile.ZipFile(zip_path, 'r') as zip_ref:

        for file_info in zip_ref.infolist():
            # 安全地处理路径,去除绝对路径和危险字符
            original_name = file_info.filename
            safe_name = os.path.normpath(original_name).lstrip('/\\')
            safe_name = safe_name.lstrip('.' + os.sep)

            # 跳过以斜杠开头的绝对路径
            if safe_name.startswith('/') or ':' in safe_name:
                safe_name = os.path.basename(safe_name)

            target_path = Path(extract_to) / safe_name
            
            # 如果是目录,创建目录
            if original_name.endswith('/'):
                target_path.mkdir(parents=True, exist_ok=True)
            else:
                # 确保父目录存在
                target_path.parent.mkdir(parents=True, exist_ok=True)

                # 解压文件
                with zip_ref.open(file_info) as src:
                    with open(target_path, 'wb') as dst:
                        dst.write(src.read())
                        
            print(f"已解压: {original_name} -> {target_path}")


zip_path = '20251114_175148_d33b98204c084b81bf56e8277097a0f5 - 副本.zip'
extract_to = '.'
extract_preserve_structure(zip_path, extract_to)
         

三. 总结

  • 路径分隔符:始终使用/作为ZIP内部路径分隔符
  • 文件权限:在非Windows系统上正确处理UNIX文件权限
  • 编码问题:处理文件名编码,支持中文等特殊字符
  • 路径安全:防止ZIP路径遍历攻击
  • 符号链接:根据需要处理符号链接(默认不跟随)
相关推荐
wuminyu3 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
ragnwang4 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
王中阳Go4 小时前
后端转 Agent 岗面试怎么答:8 个高频问题与应答口径
人工智能·后端·python·大语言模型
IMPYLH4 小时前
Linux 的时间为什么会被拨回去
linux·运维·服务器
weixin_307779134 小时前
RAG 面试陷阱——混合检索并非无条件优越:一个条件反转实验
人工智能·python·面试·职场和发展
云和数据.ChenGuang5 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
叼烟扛炮6 小时前
[Git 实战] 学习笔记:从生成 SSH 密钥到解决 TortoiseGit 推送报错全指南
linux·运维·笔记·git·学习
xbzb6 小时前
OpenStack 网络管理(理论):Linux 网络虚拟化是 Neutron 的地基
linux·服务器·网络·openstack·network·neutron
Android系统攻城狮7 小时前
Linux FFmpeg深度解析之avcodec_flush_buffers调用流程与实战(十九)
linux·运维·服务器·ffmpeg·车载音视频·ffmpeg音视频进阶
荣码8 小时前
长上下文与大文档处理:200页PDF怎么喂给AI,我踩了4个坑
java·python