如何在Python中上传整个目录到FTP?

4
我需要将一个包含子目录和文件的目录上传到FTP服务器上。但是我似乎无法做到正确上传。我希望能够按照原样上传整个目录,包括其中的子目录和文件。
ftp = FTP()
ftp.connect('host',port)
ftp.login('user','pass')
filenameCV = "directorypath"

for root,dirnames,filenames in os.walk(filenameCV):
    for files in filenames:
        print(files)
        ftp.storbinary('STOR ' + files, open(files,'rb'))
        ftp.quit()

你想要所有文件平铺在一个目录中,还是想要递归地复制目录? - jojonas
看看我的例子。我假设directorypath是您的本地基目录,并且您将所有内容上传到FTP服务器的根目录。否则,在上传之前,您必须添加一个ftp.cwd(...) - jojonas
1个回答

18

你的代码存在多个问题:首先,filenames数组仅包含实际文件名,而不是整个路径,因此需要将其与fullpath = os.path.join(root, files)连接起来,然后使用open(fullpath)。其次,在循环内部退出FTP连接,应该将ftp.quit()移动到placeFiles()函数的级别上。

为了递归地上传目录,你需要同时遍历根目录和远程目录,并在上传文件时进行操作。

完整示例代码:

import os.path, os
from ftplib import FTP, error_perm

host = 'localhost'
port = 21

ftp = FTP()
ftp.connect(host,port)
ftp.login('user','pass')
filenameCV = "directorypath"

def placeFiles(ftp, path):
    for name in os.listdir(path):
        localpath = os.path.join(path, name)
        if os.path.isfile(localpath):
            print("STOR", name, localpath)
            ftp.storbinary('STOR ' + name, open(localpath,'rb'))
        elif os.path.isdir(localpath):
            print("MKD", name)

            try:
                ftp.mkd(name)

            # ignore "directory already exists"
            except error_perm as e:
                if not e.args[0].startswith('550'): 
                    raise

            print("CWD", name)
            ftp.cwd(name)
            placeFiles(ftp, localpath)           
            print("CWD", "..")
            ftp.cwd("..")

placeFiles(ftp, filenameCV)

ftp.quit()

不错的解决方案,我可以几乎从零开始使用它。 - MichaelHuelsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接