我的脚本的工作目录如下所示:
my_script.py
random/
|_ system/
|_ folder/
| |_ fileA
|_ fileB
|_ fileC
我想压缩system
及其所有子目录和文件,以便最终结果如下所示:
output.zip
|_system/
|_ folder/
| |_ fileA
|_ fileB
|_ fileC
我的解决方案(下面)的问题是它在输出zip中包含目录random
。换句话说,生成的zip树的起始位置为my_script.py
。
target = 'random/system'
zip_file = zipfile.ZipFile('output.zip', mode='w')
for root, dirs, files in os.walk(target):
zip_file.write(root)
for file in files:
zip_file.write(root + '/' + file)
zip_file.close()
这是我的代码的(有缺陷的)输出:
output.zip
|_random/
|_system/
|_ folder/
| |_ fileA
|_ fileB
|_ fileC
无需移动任何目录/文件,如何获得所需的输出?如何在脚本和目标目录之间排除目录?
答案 0 :(得分:0)
这是一个改变工作目录的简单方法。调用脚本时,请确保其中有os.chdir()
语句。然后,当您执行os.walk()
时,您正在传递system
而不是传递random/system
。以下应该有效:
import os
import zipfile
os.chdir('random')
target = 'system'
zip_file = zipfile.ZipFile('../output.zip', mode='w')
for root, dirs, files in os.walk(target):
zip_file.write(root)
for file in files:
zip_file.write(root + '/' + file)
zip_file.close()
作为一种风格问题,您应该在with
内执行文件I / O,如下所示:
with zipfile.ZipFile('../output.zip', mode='w') as zip_file:
for root, dirs, files in os.walk(target):
zip_file.write(root)
for file in files:
zip_file.write(root + '/' + file)