如何压缩com.facebook.katana时去除Downloads目录层级?
解决Python压缩文件夹时保留多余层级的问题
这问题我太熟悉了!你遇到的是压缩时默认保留了源目录上级层级的问题,核心原因是zipfile.write()方法默认会把文件的完整系统路径写入压缩包,所以解压后会带出Downloads这个上级目录。要解决这个,我们只需要利用write()的arcname参数,手动指定压缩包内的文件路径,去掉多余的层级就行。
修改后的完整代码
import os import zipfile def retrieve_file_paths(dir_name): file_paths = [] # 遍历目标目录下的所有文件(包括子目录) for root, _, files in os.walk(dir_name): for filename in files: full_path = os.path.join(root, filename) file_paths.append(full_path) return file_paths def main(): # 要压缩的目标文件夹(Downloads下的com.facebook.katana) target_dir = './Downloads/com.facebook.katana' # 输出zip文件的保存路径(AndroidBags目录下) output_zip = './AndroidBags/com.facebook.katana.zip' # 获取所有需要压缩的文件路径 file_paths = retrieve_file_paths(target_dir) print('即将压缩的文件列表:') for path in file_paths: print(path) # 创建zip文件并写入内容 with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zip_file: for full_path in file_paths: # 核心:计算文件相对于目标文件夹的相对路径,作为压缩包内的路径 arcname = os.path.relpath(full_path, start=target_dir) # 写入文件时指定arcname,避免带入上级目录 zip_file.write(full_path, arcname=arcname) print(f'{output_zip} 已成功生成!') if __name__ == '__main__': main()
关键修改说明
指定正确的路径:
- 把原代码中模糊的
dir_name改成明确的目标文件夹路径./Downloads/com.facebook.katana - 直接指定输出zip的路径为
./AndroidBags/com.facebook.katana.zip,确保文件生成到你想要的目录
- 把原代码中模糊的
使用
arcname控制压缩包内结构:- 通过
os.path.relpath(full_path, start=target_dir)计算每个文件相对于目标文件夹的相对路径,比如:- 原路径
./Downloads/com.facebook.katana/one.txt的相对路径是one.txt - 原路径
./Downloads/com.facebook.katana/Data/PetController.java的相对路径是Data/PetController.java
- 原路径
- 把这个相对路径传给
zipfile.write()的arcname参数,压缩包内就会保留com.facebook.katana内部的目录结构,而不会带出Downloads层级
- 通过
启用压缩(可选):
- 添加了
zipfile.ZIP_DEFLATED参数,让生成的zip文件是压缩后的(原代码默认是不压缩的存储模式),如果不需要压缩可以去掉这个参数
- 添加了
这样修改后,你生成的zip文件解压后就会直接显示com.facebook.katana文件夹及其包含的所有文件和子目录啦!
内容的提问来源于stack exchange,提问作者userHG
相关产品推荐
相关产品推荐

