2012-05-17 13 views
8

Estaba usando pycurl para transferir archivos a través de ftp en python. Podría crear los directorios que faltan automáticamente en mi servidor remoto usando:Crear directorios que faltan en ftplib storbinary

c.setopt(pycurl.FTP_CREATE_MISSING_DIRS, 1) 

por alguna razón, tengo que cambiar a ftplib. Pero no sé cómo hacer lo mismo aquí. ¿Hay alguna opción para agregar a la función de Storbinary para hacer eso? o tengo que crear los directorios manualmente?

Respuesta

9

FTP_CREATE_MISSING_DIRS es una operación curl (added here). Me arriesgaría a suponer que tienes que hacerlo manualmente con ftplib, pero me gustaría que se demuestre que está mal, ¿alguien?

me gustaría hacer algo como lo siguiente: (no probado, y necesito recuperar 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 

O usted podría hacer directory_exists como esto: (un poco más difícil de leer?)

# 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

Gracias, aunque no era exactamente lo que estaba buscando, pero fue una buena respuesta. Gracias;) – AliBZ

+1

No, no tiene que hacerlo manualmente. Simplemente puede llamar al método 'makedirs' en el paquete' ftputil' en su lugar. – xApple

4

Intenté agregar esto como un comentario a la respuesta de @Alex L, pero fue demasiado largo. Debe descender recursivamente cuando cambie de directorio si desea crear directorios en el camino. P.ej.

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

Sé que es una especie de publicación anterior, pero solo la necesitaba y se me ocurrió una función muy simple. Soy nuevo en Python, así que agradecería cualquier comentario. ejemplo

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) 

Uso:

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

muy bueno! 'dir' es una función incorporada de python; es posible que desee cambiar el nombre de la variable ... también desea detectar excepciones específicas, no todas ellas – xApple

+0

Gracias xApple por sus comentarios. Reemplacé 'dir' y restringí solo para atrapar excepciones de IOError. – lecnt

+0

Creo que olvidó reemplazar una instancia de la variable 'dir'. – xApple

0

Este código va a crear todas las carpetas que faltan en ruta:

... 

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) 

Este código se presentarán todas directorios en camino y crear directorios que faltan

antes de "FTP/for_Vadim /" después de "FTP/for_Vadim/1/2/3 /"

Cuestiones relacionadas