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

Windows下使用Python压缩多文件时如何获取相对路径

解决压缩包生成时包含完整盘符路径的问题

问题描述

我正在尝试编写一个自动遍历文件夹并将所有文件打包为单个.zip文件的函数,目前功能可运行,但生成的压缩包内存在从盘符开始的多层嵌套文件夹。当前生成的压缩包内是C>User>Documents>ZipThisUp>文件的嵌套结构,我期望压缩包内要么直接包含文件,要么仅包含ZipThisUp文件夹及其内的文件。尝试过用os.chdir切换目录强制使用相对路径,最初用os.listdir导致文件找不到错误,换成os.walk后压缩包可生成但带完整路径,尝试os.path.basename等方法又出现文件找不到的问题。


方案1:压缩包内直接包含所有文件(保留子文件夹结构,无外层ZipThisUp)

核心是利用ZipFile.write()的arcname参数指定压缩包内的相对路径,避免写入绝对路径。使用os.path.relpath()生成文件相对于目标文件夹的相对路径:

import os
from zipfile import ZipFile

def ZipItUp():
    '''
    将"ZipThisUp"文件夹内的所有文件/子文件夹打包到压缩包根目录
    '''
    cwd = os.path.dirname(__file__)
    sourceDir = os.path.join(cwd, 'ZipThisUp')
    zipFilePath = os.path.join(sourceDir, 'MyZipFile.zip')

    # 删除已存在的压缩包
    if os.path.exists(zipFilePath):
        os.remove(zipFilePath)
    
    with ZipFile(zipFilePath, 'w') as myZip:
        for root, _, files in os.walk(sourceDir):
            for filename in files:
                filepath = os.path.join(root, filename)
                # 跳过__pycache__相关文件
                if '__pycache__' in filepath:
                    continue
                # 计算文件相对于sourceDir的路径,作为压缩包内的存储路径
                arcname = os.path.relpath(filepath, sourceDir)
                myZip.write(filepath, arcname=arcname)
    return

方案2:压缩包内保留ZipThisUp外层文件夹

如果希望压缩包打开后直接看到ZipThisUp文件夹,只需计算文件相对于cwd的路径作为arcname,同时建议将压缩包放在cwd目录下,避免被嵌套进压缩包本身:

import os
from zipfile import ZipFile

def ZipItUp():
    '''
    将"ZipThisUp"整个文件夹打包,压缩包内保留该外层文件夹
    '''
    cwd = os.path.dirname(__file__)
    sourceDir = os.path.join(cwd, 'ZipThisUp')
    # 将压缩包放在当前脚本目录,而非ZipThisUp内,避免自我嵌套
    zipFilePath = os.path.join(cwd, 'MyZipFile.zip')

    if os.path.exists(zipFilePath):
        os.remove(zipFilePath)
    
    with ZipFile(zipFilePath, 'w') as myZip:
        for root, _, files in os.walk(sourceDir):
            for filename in files:
                filepath = os.path.join(root, filename)
                if '__pycache__' in filepath:
                    continue
                # 计算文件相对于cwd的路径,保留ZipThisUp外层文件夹
                arcname = os.path.relpath(filepath, cwd)
                myZip.write(filepath, arcname=arcname)
    return

关键说明

  • ZipFile.write(filepath, arcname):arcname参数决定文件在压缩包内的存储路径,默认使用文件的绝对路径,这是导致盘符嵌套的根本原因。
  • os.path.relpath(target, start):自动计算目标路径相对于起始路径的相对路径,避免手动拼接路径时出错。
  • 优化__pycache__过滤逻辑:检查路径中是否包含该字符串,避免遗漏__pycache__文件夹内的缓存文件。

内容的提问来源于stack exchange,提问作者Mickspad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:50:49