创建FTPLIB storbinary丢失的目录(Create missing directorie

2019-07-29 10:17发布

我使用pycurl通过FTP在蟒蛇传输文件。 我可以用我的远程服务器上自动创建缺失的目录:

c.setopt(pycurl.FTP_CREATE_MISSING_DIRS, 1)

因为某些原因,我要切换到FTPLIB。 但我不知道怎么在这里一样。 是否有任何选项添加到storbinary功能来做到这一点? 或我必须手动创建目录?

Answer 1:

FTP_CREATE_MISSING_DIRS是卷曲操作( 这里补充 )。 我大胆地说,你有FTPLIB手工做一个猜测,但我很乐意被证明是错误的,任何人吗?

我会做类似如下:(未经测试,并且需要捕捉ftplib.all_errors

ftp = ... # Create connection

# Change directories - create if it doesn't exist
def chdir(dir): 
    if directory_exists(dir) is False: # (or negate, whatever you prefer for readability)
        ftp.mkd(dir)
    ftp.cwd(dir)

# Check if directory exists (in current location)
def directory_exists(dir):
    filelist = []
    ftp.retrlines('LIST',filelist.append)
    for f in filelist:
        if f.split()[-1] == dir and f.upper().startswith('D'):
            return True
    return False

或者你可以做directory_exists这样的:(有点难以阅读?)

# Check if directory exists (in current location)
def directory_exists(dir):
    filelist = []
    ftp.retrlines('LIST',filelist.append)
    return any(f.split()[-1] == dir and f.upper().startswith('D') for f in filelist)


Answer 2:

我知道这是一种旧的文章,但我只需要这一点,并用一个非常简单的功能上来。 我是新来的Python,所以我会很感激的任何反馈。

from ftplib import FTP

ftp = FTP('domain.com', 'username', 'password')

def cdTree(currentDir):
    if currentDir != "":
        try:
            ftp.cwd(currentDir)
        except IOError:
            cdTree("/".join(currentDir.split("/")[:-1]))
            ftp.mkd(currentDir)
            ftp.cwd(currentDir)

用法示例:

cdTree("/this/is/an/example")


Answer 3:

我尝试添加这是对的的@Alex大号答案评论,但它是太长了。 您需要更改目录时,如果你想创建的路上目录下降递归。 例如

def chdir(ftp, directory):
    ch_dir_rec(ftp,directory.split('/')) 

# Check if directory exists (in current location)
def directory_exists(ftp, directory):
    filelist = []
    ftp.retrlines('LIST',filelist.append)
    for f in filelist:
        if f.split()[-1] == directory and f.upper().startswith('D'):
            return True
    return False

def ch_dir_rec(ftp, descending_path_split):
    if len(descending_path_split) == 0:
        return

    next_level_directory = descending_path_split.pop(0)

    if not directory_exists(ftp,next_level_directory):
        ftp.mkd(next_level_directory)
    ftp.cwd(next_level_directory)
    ch_dir_rec(ftp,descending_path_split)


Answer 4:

此代码将创建路径中的所有丢失的文件夹:

...

def chdir(ftp_path, ftp_conn):
    dirs = [d for d in ftp_path.split('/') if d != '']
    for p in dirs:
        print(p)
        check_dir(p, ftp_conn)


def check_dir(dir, ftp_conn):
    filelist = []
    ftp_conn.retrlines('LIST', filelist.append)
    found = False

    for f in filelist:
        if f.split()[-1] == dir and f.lower().startswith('d'):
            found = True

    if not found:
        ftp_conn.mkd(dir)
    ftp_conn.cwd(dir)

if __name__ == '__main__':
    ftp_conn = ... # ftp connection
    t = 'FTP/for_Vadim/1/2/3/'

    chdir(t, ftp_conn)

此代码将检查在路径上的所有显示目录和创建丢失的迪尔斯

前 “FTP / for_Vadim /” 之后 “FTP / for_Vadim / 1/2/3 /”



Answer 5:

我使用的是这样的事情(不CWD):

# -*- coding:utf-8 -*-

from ftplib import FTP, error_perm


def createDirs(ftp, dirpath):
    """
    Create dir with subdirs.

    :param ftp:     connected FTP
    :param dirpath: path (like 'test/test1/test2')

    :type ftp:      FTP
    :type dirpath:  str
    :rtype:         None

    """

    dirpath = dirpath.replace('\\', '/')
    tmp = dirpath.split('/')
    dirs = []

    for _ in tmp:
        if len(dirs) == 0:
            dirs.append(_)
            continue

        dirs.append(dirs[-1] + '/' + _)

    for _ in dirs:
        try:
            ftp.mkd(_)
        except error_perm as e:
            e_str = str(e)
            if '550' in e_str and 'File exists' in e_str:
                continue


if __name__ == '__main__':
    # init ftp
    createDirs(ftp=ftp, dirpath='test/1/2/3')


文章来源: Create missing directories in ftplib storbinary