如何用Python 3打包保留指定嵌套目录结构的文件夹以适配FTP服务器要求
如何用Python 3打包保留指定嵌套目录结构的文件夹以适配FTP服务器要求
嘿,我完全懂你遇到的问题——不管是用shutil.make_archive还是直接调用7zip的常规方式,默认都会把源文件夹的内容直接打平到zip根目录,根本出不来你要的product_a1/product_a1/...这种嵌套层级。别慌,我给你两个实用的方案,都能精准生成FTP服务器要求的结构:
方案一:用临时目录构造结构 + shutil打包(纯Python依赖,无需额外工具)
这个方案的核心思路是先搭一个“临时脚手架”,把你要打包的目录套进指定的外层结构里,再进行打包,完美避开shutil的默认行为。
import shutil import tempfile import os def pack_nested_structure(source_dir, output_zip): # source_dir:你本地存放内层product_a1的路径(里面包含my_file.txt、completed等文件/子目录) # output_zip:最终生成的zip文件路径(比如"./ftp_package.zip") with tempfile.TemporaryDirectory() as temp_root: # 第一步:在临时目录创建外层的product_a1文件夹 outer_product_dir = os.path.join(temp_root, "product_a1") os.makedirs(outer_product_dir) # 第二步:把你本地的product_a1文件夹复制到外层文件夹里 shutil.copytree( source_dir, os.path.join(outer_product_dir, "product_a1") ) # 第三步:打包临时目录的全部内容,这样zip根目录就是product_a1,里面嵌套着内层的product_a1 shutil.make_archive( output_zip.replace(".zip", ""), # make_archive会自动加.zip后缀,所以这里先去掉原后缀 "zip", root_dir=temp_root, base_dir="" ) # 调用示例:假设你本地的product_a1文件夹路径是"./my_product_files" pack_nested_structure("./my_product_files", "./ftp_ready.zip")
方案细节说明
- 临时目录
tempfile.TemporaryDirectory()会在代码块执行完后自动销毁,完全不用担心残留文件 - 打包时
root_dir指定为临时目录,base_dir留空,这样shutil会把临时目录里的所有内容(也就是外层product_a1)作为zip的根目录
方案二:调用7zip命令行(和服务器工具对齐,避免兼容性问题)
既然服务器端用的是7zip,如果你本地也安装了7zip,直接调用命令行打包会更稳妥,和服务器的处理逻辑完全一致。
import shutil import tempfile import os import subprocess def pack_with_7zip(source_dir, output_zip): with tempfile.TemporaryDirectory() as temp_root: # 同样先构造双层嵌套的临时结构 outer_product_dir = os.path.join(temp_root, "product_a1") os.makedirs(outer_product_dir) shutil.copytree(source_dir, os.path.join(outer_product_dir, "product_a1")) # 调用7zip命令打包临时目录里的product_a1 cmd = [ "7z", # 如果7zip不在系统PATH里,这里要写绝对路径,比如"C:\\Program Files\\7-Zip\\7z.exe" "a", "-tzip", # a=添加文件到压缩包,-tzip=指定格式为zip os.path.abspath(output_zip), "product_a1\\*" # 只打包临时目录下的product_a1目录及其内容 ] # 执行命令,工作目录设为临时目录 subprocess.run(cmd, cwd=temp_root, check=True) # 调用示例 pack_with_7zip("./my_product_files", "./ftp_7zip_ready.zip")
方案细节说明
- 确保7zip的可执行文件在系统环境变量
PATH里,或者直接写绝对路径 check=True会让subprocess在命令执行失败时抛出异常,方便你排查问题
额外注意事项
- 请确认你的
source_dir路径指向的是包含my_file.txt、completed等内容的product_a1文件夹,而不是它的父目录 - 两种方案最终生成的zip文件结构都会是:
完全符合FTP服务器的要求product_a1/ product_a1/ my_file.txt completed etc/
备注:内容来源于stack exchange,提问作者Andrew Day
相关产品推荐
相关产品推荐

