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

问题描述 投票:0回答:1

我正在尝试创建一个自动运行文件夹并将所有文件放入单个 .zip 文件中的函数,当我让它工作时,它会在 zip 文件内创建一系列文件夹,这些文件夹一直向上到驱动器盘符。

import sys
import os
from zipfile import ZipFile

def ZipItUp():
    '''
    Zips up the content of the folder "ZipThisUp"
    '''
    cwd = os.path.dirname(__file__)
    os.chdir(cwd)
    sourceDir = os.path.join(cwd, 'ZipThisUp')


    zipFilePath = os.path.join(sourceDir, 'MyZipFile.zip')
    if os.path.exists(zipFilePath):
        os.remove(zipFilePath)
    
    itemsInDir = []

    for root, _, files in os.walk(sourceDir):
        for filename in files:
            filepath = os.path.join(root, filename)
            itemsInDir.append(filepath)


    with ZipFile(zipFilePath, 'w') as myZip:
        for item in itemsInDir:
            # Include everything in the folder except for the python cache files,
            # They'll be re-cached on the other machine
            if os.path.basename(item) != '__pycache__':
                myZip.write(item)
    return

我在这里遇到的问题是我认为是 Windows 文件路径问题(尽管我不太确定,因为我还没有在 Linux 上尝试过)

zip 文件在我期望的位置生成,但是当我打开它时,它是一系列嵌套文件夹:C > 用户 > 文档 > ZipThisUp > 然后是我的文件

当我希望 .zip 文件只包含我的文件或包含我的文件的“ZipThisUp”单个文件夹时

我正在做的代码的开头

os.chdir(cwd)
是我试图强制 os.path 使用相对路径而不是绝对路径。

我最初使用

os.listdir
而不是 os.walk,这导致错误说找不到文件,切换到 os.walk 得到了实际生成的 .zip 文件,但带有完整路径。

然后我尝试包括

os.path.basename()
os.path.realpath(__file__)
,这导致返回文件未找到错误。

我环顾四周,试图找到另一篇包含此问题的帖子,但我找不到,任何帮助将不胜感激。

python windows zip os.path
1个回答
0
投票

正如这篇文章中提到的,一个简单的解决方法是使用

shutil
库。

如果您仍然想使用

zipfile
请注意
write()
方法需要 另一个参数:

ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)

如果

arcname
为空,则用于保存每个文件的名称等于完整路径(又名
filename
),但您可以指定不同的
arcname
。因此,您可以删除每个
sourceDir
中的
item
,如下所示:

 with ZipFile(zipFilePath, 'w') as myZip:
    for item in itemsInDir:
        # Include everything in the folder except for the python cache files,
        # They'll be re-cached on the other machine
        if os.path.basename(item) != '__pycache__':
            arcname = item.replace(f'{sourceDir}\\', '')
            myZip.write(item, arcname)
© www.soinside.com 2019 - 2024. All rights reserved.