2012-05-17 10 views
8

Ich benutzte pycurl um Dateien über FTP in Python zu übertragen. Ich könnte die fehlenden Verzeichnisse automatisch auf meinem Remote-Server erstellen mit:Erstelle fehlende Verzeichnisse in ftplib storbinary

aus bestimmten Gründen muss ich zu ftplib wechseln. Aber ich weiß nicht wie man das hier gleich macht. Gibt es eine Möglichkeit, die storbinary-Funktion hinzuzufügen, um das zu tun? oder muss ich die Verzeichnisse manuell erstellen?

Antwort

9

FTP_CREATE_MISSING_DIRS ist ein Rollvorgang (added here). Ich würde eine Vermutung riskieren, dass Sie es manuell mit ftplib tun müssen, aber ich würde gerne falsch bewiesen werden, jemand?

Ich würde etwas tun, wie folgt aus: (ungetestet, und müssen ftplib.all_errors fangen)

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 

Oder Sie könnten directory_exists tun, wie folgt: (etwas schwieriger zu lesen?)

# 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

Danke, obwohl es nicht genau das war, wonach ich suchte, aber es war eine gute Antwort. Danke;) – AliBZ

+1

Nein, Sie müssen es nicht manuell tun. Sie könnten stattdessen die 'makedirs'-Methode im' ftputil'-Paket aufrufen. – xApple

4

Ich habe versucht, dies als Kommentar zur Antwort von @Alex L hinzuzufügen, aber es war zu lang. Sie müssen beim Ändern des Verzeichnisses rekursiv absteigen, wenn Sie Verzeichnisse auf dem Weg erstellen wollen. Z.B.

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

Ich weiß, es ist eine Art von einem alten Beitrag, aber ich brauchte nur das und kam mit einer sehr einfachen Funktion. Ich bin neu bei Python und würde mich über Feedback freuen.

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) 

Anwendungsbeispiel:

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

sehr nett! 'dir' ist ein eingebauter Python, den Sie möglicherweise ändern möchten, dass der Name der Variablen ... auch Sie bestimmte Ausnahmen abfangen möchten, nicht alle von ihnen – xApple

+0

Vielen Dank für Ihr Feedback xApple. Ich habe "dir" ersetzt und eingeschränkt, um nur IOError-Ausnahmen zu fangen. – lecnt

+0

Ich glaube, Sie haben vergessen, eine Instanz der 'dir' Variable zu ersetzen. – xApple

0

Dieser Code wird alle fehlenden Ordner im Pfad erstellen:

... 

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) 

Dieser Code wird alle Verzeichnisse in Pfad überprüfen und erstellen dirs

fehlt vor "FTP/for_Vadim /" nach "FTP/for_Vadim/1/2/3 /"

Verwandte Themen