2012-05-17 10 views
8

Stavo usando pycurl per trasferire file su ftp in python. Potrei creare le directory mancanti automaticamente sul mio server remoto utilizzando:Creare directory mancanti in ftblib storbinary

c.setopt(pycurl.FTP_CREATE_MISSING_DIRS, 1) 

per alcuni motivi, devo passare a ftplib. Ma non so come fare lo stesso qui. C'è qualche opzione da aggiungere alla funzione storbinary per farlo? o devo creare manualmente le directory?

risposta

9

FTP_CREATE_MISSING_DIRS è un'operazione di arricciatura (added here). Mi azzardo a indovinare che devi farlo manualmente con ftplib, ma mi piacerebbe essere smentito, chiunque?

farei qualcosa di simile a quanto segue: (non testato, e la necessità di prendere 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 

Oppure si potrebbe fare directory_exists in questo modo: (un po 'più difficile da leggere?)

# 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

Grazie, anche se non era esattamente quello che stavo cercando, ma è stata una buona risposta. Grazie;) – AliBZ

+1

No, non è necessario farlo manualmente. Potresti semplicemente chiamare il metodo 'makedirs' nel pacchetto' ftputil'. – xApple

4

Ho provato ad aggiungere questo come commento alla risposta di @Alex L, ma era troppo lungo. È necessario scendere ricorsivamente quando si cambia directory se si desidera creare directory in arrivo. Per esempio.

6

So che è un po 'vecchio, ma ho solo bisogno di questo e ho trovato una funzione molto semplice. Sono nuovo di Python quindi apprezzerei qualsiasi feedback. esempio

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) 

Usage:

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

molto bello! 'dir' è un python integrato che potresti voler cambiare il nome della variabile ... anche tu vuoi catturare eccezioni specifiche, non tutte loro – xApple

+0

Grazie xApple per il tuo feedback. Ho sostituito 'dir' e ristretto per catturare solo eccezioni IOError. – lecnt

+0

Penso che tu abbia dimenticato di sostituire un'istanza della variabile 'dir'. – xApple

0

Questo codice crea tutte le cartelle mancanti nel percorso:

... 

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) 

Questo codice controllerà tutti i dirs di percorso e di creare dirs mancanti

prima di "FTP/for_Vadim /" dopo "FTP/for_Vadim/1/2/3 /"