我正在尝试创建一个自动运行文件夹并将所有文件放入单个 .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__)
,这导致返回文件未找到错误。
我环顾四周,试图找到另一篇包含此问题的帖子,但我找不到,任何帮助将不胜感激。
正如这篇文章中提到的,一个简单的解决方法是使用
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)