2012-05-17 7 views
8

Я использовал pycurl для передачи файлов по ftp в python. Я мог автоматически создавать отсутствующие каталоги на моем удаленном сервере, используя:Создание отсутствующих каталогов в ftplib storbinary

c.setopt(pycurl.FTP_CREATE_MISSING_DIRS, 1) 

По каким-то причинам я должен перейти на ftplib. Но я не знаю, как к тому же здесь. Есть ли возможность добавить к хранимой функции для этого? или мне нужно создать каталоги вручную?

ответ

9

FTP_CREATE_MISSING_DIRS - операция завитка (added here). Я бы рискнул предположить, что вы должны сделать это вручную с 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) 
+1

Спасибо, хотя это было не совсем то, что я искал, но это был хороший ответ. Thanx;) – AliBZ

+1

Нет, вам не нужно делать это вручную. Вместо этого вы можете просто вызвать метод 'makedirs' в пакете' ftputil'. – xApple

4

Я попытался добавить это как комментарий к ответу @Alex L, но он был слишком длинным. Вам нужно с рекурсией спуститься при смене каталога, если вы хотите создать каталоги на этом пути. Например.

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) 
6

Я знаю, что это своего рода старый пост, но я просто нуждался в этом и придумал очень простую функцию. Я новичок в 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") 
+2

очень приятно! 'dir' является встроенным python, вы можете изменить это имя переменной ... также вы хотите поймать определенные исключения, но не все из них – xApple

+0

Спасибо, xApple за ваши отзывы. Я заменил 'dir' и ограничился только исключениями IOError. – lecnt

+0

Я думаю, вы забыли заменить экземпляр переменной 'dir'. – xApple

0

Этот код будет создавать все недостающие папки в пути:

... 

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 /»

Смежные вопросы