python - 使用 Zipfile 和 Python 获取正确的目录结构
问题描述
我有一个类似的目录结构,/level1/level2/level3/level4/level5
在第 5 级我有 .json 文件,我想用压缩版本替换,所以从
/level1/level2/level3/level4/level5/{file1.json, file2.json, file3.json}
到
/level1/level2/level3/level4/level5/{file1.zip, file2.zip, file3.zip}
但是,我的代码在脚本所在的文件夹(级别 3)中生成 zip 文件,导致/level1/level2/[level3]{file1.zip, file2.zip, file3.zip}/level4/level5/{file1.json, file2.json, file3.json}
此外,如果我解压缩文件,我会得到整个目录结构而不仅仅是文件。例如,如果我解压缩 file1.zip 我得到/level1/level2/[level3]{(/level1/level2/level3/level4/level5/file1.json), file2.zip, file3.zip}/level4/level5/{file1.json, file2.json, file3.json}
我尝试了不同的论点,但我不确定如何得到我想要的结果。我怎样才能做到这一点?
这是我目前的代码
path = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
level4, level5)
for root, dirs, files in os.walk(path, topdown=True):
print('This is root: ', root)
for file in files:
zf = zipfile.ZipFile(
'{}.zip'.format(file[:-5]), 'w',
zipfile.ZIP_DEFLATED)
zf.write(os.path.join(root, file))
zf.close()
解决方案
您应该创建连接根路径的 zip 文件,以便在 JSON 文件所在的位置创建 zip 文件,并且在将 JSON 文件写入 zip 文件时,使用writestr
方法而不是,write
以便您可以使用您想要的路径名,在这种情况下,它只是没有路径名的文件名:
for root, dirs, files in os.walk(path, topdown=True):
print('This is root: ', root)
for file in files:
zf = zipfile.ZipFile(os.path.join(root, '{}.zip'.format(file[:-5])), 'w', zipfile.ZIP_DEFLATED)
zf.writestr(file, open(os.path.join(root, file)).read())
zf.close()
推荐阅读
- node.js - 几种类型的身份验证谷歌助手
- php - 在 foreach 循环 PHP Laravel 中显示一个属性以将其他属性分组
- python - 如何使用 imageio imread 从单通道图像(灰度)中获取多通道数组(RGB)?
- karate - 空手道是否支持 CI 环境中的无头测试(gitlab CI)
- discord.py - 检查反应 Discord.py
- javascript - 如何消除菜单项与其下拉菜单之间的差距?
- html - 按下选项卡时,NVDA 在初始页面加载时跳过第一个可聚焦元素
- airflow - DAG 未暂停后气流调度旧任务
- git - 带有 npm 包的 git 同步存储库?
- c# - 我应该将 ToUpper() 方法放在代码中的什么位置才能生效?