Ausgabe
Ich erhalte eine [Errno 2] No such file or directory
Fehlermeldung, 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.retrbinary
und 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)