ftplib - Download von Dateien, die Sonderzeichen enthalten

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Cluster
User
Beiträge: 3
Registriert: Dienstag 1. Februar 2011, 15:00

Hallo zusammen,
ich habe ein Problem beim Ftp-Download, bei dem ich einfach nicht weiter komme. Und zwar
will ich einfach Text-Dateien herunterladen, welche z.b Umlaute enthalten. Jedoch werden
diese Sonderzeichen nicht korrekt mitübertragen und dann falsch dargestellt.

Hier der Quellcode:

Code: Alles auswählen

import ftplib

ftp = ftplib.FTP("172.16.0.1")
ftp.login("xyz","xyz")

file = open('chat.txt', 'wb')

def handleDownload(block):
    file.write(block)
    print "."

filename = 'chat.txt'

ftp.retrbinary('RETR ' + filename, handleDownload)

file.close()
ftp.quit()
Inhalt von chat.txt auf FTP-Server:
Änderungen
360 m³

Inhalt des heruntergeladen Files:
�nderungen vorbehalten
360 m�

Ich habe auch verschiedene Codecs versucht, aber nichts hat geklappt.
Ich hoffe ihr könnt mir weiter helfen. Irgendwie muss es doch gehen, die
Daten 1:1 zu kopieren. Vielen Dank im Voraus ...
BlackJack

@Cluster: Das nützt nicht viel den "Inhalt" hier zu zeigen ohne dazu zu sagen welche Kodierung der Anzeige zugrunde liegt.

Ich vermute mal Du hast da gar kein Problem mit FTP sondern mit der Anzeige des Inhalts. Wie zeigst Du das denn jeweils an? Mit welchem Programm? Und was denken diese Programme jeweils was die Kodierung des Textes ist?
Cluster
User
Beiträge: 3
Registriert: Dienstag 1. Februar 2011, 15:00

Ich arbeite via SSH auf einer Suse Linux Enterprise Server 11 - Maschine.

Das eingestellte Charakter-Set ist:

Code: Alles auswählen

server:~ # locale
LANG=POSIX
LC_CTYPE=de_DE.UTF-8
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
In Putty ist ebenfalls UTF-8 eingestellt.

Die Files sehe ich mir mit dem nano-Editor an.
Wenn ich das File mit cat anzeigen lasse, sind auch hier die Sonderzeichen kryptisch ...

Meiner Meinung hat es damit zu tun, dass der Inhalt mit ascii-Zeichen (128) gespeichert
werden soll. Da aber die Sonderzeichen außerhalb des Bereiches liegen, kann er dementsprechend
diese Zeichen nicht verarbeiten.

Wenn ich im Downloadhandler die Daten entsprechend Codieren will

Code: Alles auswählen

def handleDownload(block):
    block.encode("utf-8")
    file.write(block)
    print "."
dann bekomme ich folgende Meldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "ftp.py", line 15, in <module>
    ftp.retrbinary('RETR ' + filename, handleDownload)
  File "/usr/lib64/python2.6/ftplib.py", line 399, in retrbinary
    callback(data)
  File "ftp.py", line 9, in handleDownload
    block.encode("utf-8")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
Cluster
User
Beiträge: 3
Registriert: Dienstag 1. Februar 2011, 15:00

Ich habe das Problem gelöst.
Es liegt nicht am System oder ftplib, sondern an der Quelldatei auf dem FTP-Server.
Das ganze wurde mit ANSI-Codierung abgespeichert. Habe jetz das File
manuell nochmals mit UTF-8 hochgeladen und siehe da ... es klappt.

Vielen Dank für die Bemühungen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sowas wie ANSI-Codierung gibt es nicht. Du meinst vielleicht ASCII.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Hieß der erweiterte ASCII-Zeichensatz, unter Windows, nicht Ansi-Zeichensatz ?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Xynon1 hat geschrieben:Hieß der erweiterte ASCII-Zeichensatz, unter Windows, nicht Ansi-Zeichensatz ?
Naja, nicht wirklich. Aber Microsoft nimmts selbst nicht so genau, Notepad speichert Dateien auch in "Unicode" ab, was aber eher UTF-8 oder UTF-16 ist (weiß nicht mehr genau welches).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Ah, also ANSI existiert nicht, nur CP-1252, gut zu wissen :)

Notepad scheint alle drei speichern zu können.
Seit der Version 4.0 (mit Windows NT) unterstützt das Programm – neben dem bereits zuvor verwendeten ANSI-Textformat (siehe auch Windows-1252) – auch Unicode mit den Zeichenkodierungen UTF-16, UTF-16 Big Endian und UTF-8.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten