[FIXED] Laden Sie CSV-Dateien über FTP mit Python ftplib in Dataframe herunter – [Errno 2] Keine solche Datei oder kein solches Verzeichnis

Ausgabe

Ich erhalte eine [Errno 2] No such file or directoryFehlermeldung, wenn ich versuche, Dateien von einem FTP-Server auf einen Pandas-Datenrahmen herunterzuladen. Die Dateien befinden sich im Stammverzeichnis des FTP. Wenn ich die drucke

Ich vermute, dass die pd.read_csv()Funktion mein lokales Dateisystem betrachtet … dh den lokalen Pfad, in dem sich das Skript befindet …. Aber ich verstehe nicht, wie ich das ändern soll.

def fetch_files(site, username, password, directory: str = '/', filematch: str = '*.csv'):
    with ftplib.FTP(site) as ftp:
        # pass the url without protocol
        ftp = ftplib.FTP(site)
        # pass credentials if anonymous access is not allowed
        ftp.login(username, password)
        ftp.cwd(directory)
        list_ = []
        for file_ in ftp.nlst(filematch):
            print(file_) # This works
            df = pd.read_csv(file_, index_col=None, header=0) # This fails
            list_.append(df)

Oder müsste ich die Methode ftp.retrlines() verwenden? Wenn ja, was ist der Unterschied zwischen dem Parameter „LIST“ „MLSD“?

Nebenbei bemerkt: Die Dateien in den CSVs enthalten HTML-Code wie &, der die SQL-Masseneinfügung auslöst. Der Grund, warum ich sie in einen Datenrahmen lese, besteht darin, die Kodierung zu ändern und die einzelnen Dateien zusammenzuführen. Gibt es eine schnellere Möglichkeit, dies direkt über das Python-CSV-Modul zu tun? Ich denke das geht schneller?

Vielen Dank im Voraus

Lösung

Verwenden Sie FTP.retrbinaryund BytesIO, um die Datei in den Speicher herunterzuladen, und übergeben Sie dann das dateiähnliche Objekt im Speicher an read_csv:

flo = BytesIO()
ftp.retrbinary('RETR ' + file_, flo.write)
flo.seek(0)
pd.read_csv(flo, ...)

Ähnliche Frage: Lesen von Dateien vom FTP-Server zu DataFrame in Python


Das obige lädt die gesamte CSV-Datei in einen Speicher und analysiert sie erst dann. Wenn Sie die Datei beim Herunterladen speichern möchten, müssten Sie wahrscheinlich ein intelligentes benutzerdefiniertes dateiähnliches Objekt implementieren. Was ist nicht einfach.

Für eine ähnliche Frage siehe meine Antwort auf:
Get file names within a zip file on FTP server without downloading whole archive .


Beantwortet von –
Martin Prikryl


Antwort geprüft von –
Katrina (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like