You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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文件结构都会是:
    product_a1/
        product_a1/
            my_file.txt
            completed
            etc/
    
    完全符合FTP服务器的要求

备注:内容来源于stack exchange,提问作者Andrew Day

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:13:00