Seien Sie vorsichtig, da einige Bibliotheken in Übersee eine angemessene Vorstellung von der Codierung haben.
Aus geschäftlichen Gründen musste ich sftp mit Python berühren, also habe ich paramiko verwendet und versucht, die Datei direkt vom FTP-Server herunterzuladen und die darin enthaltene Textdatei für die statistische Verarbeitung anzuwenden. In der API-Dokumentation kann "die Funktion file () für denselben Zweck wie die Python-Datei verwendet werden". Daher trat der folgende Fehler auf, als ich den Pfad usw. entsprechend spezifizierte.
UnicodeDecodeError: 'utf-8' codec can't decode byte ~~ in position ~~: invalid start byte
Der Code sieht wie folgt aus.
client = paramiko.SSHClient()
client.connect(Entsprechende Verbindungsinformationen)
sftp_connection = client.open_sftp()
with sftp_connection.open(Dateipfad) as f
for line in f:
print(line)
Als ich das tat, bekam ich einen UnicodeDecodeError in der Nähe der for-Anweisung.
Kurz gesagt, es war "weil Sie die Codierung beim Abrufen des Inhalts einer Datei nicht angeben können". Ich versuche, eine in ANSI mit UTF-8 codierte Textdatei zu lesen, und es wird eine Fehlermeldung angezeigt. Ich habe mir die Quelle angesehen, aber im Moment kann ich die Codierung beim Öffnen nicht angeben. Ich kann es mit Standardeingabe machen.
Es scheint unmöglich zu sein, den Inhalt der Datei auf Englisch umzuschreiben oder mit utf neu zu erstellen. Deshalb habe ich mich dieses Mal entschlossen, sie binär zu öffnen und separat mit ANSI zu codieren, um sie zu lesen. Insbesondere wurde die folgende with-Anweisung im obigen Code mit dem folgenden Bild neu geschrieben. (Der Grund, warum es in gewissem Maße der Standardeingabe ähnelt, ist, dass ich in der Lage sein wollte, lokal anstelle von SFTP zu debuggen. Natürlich dauert das Debuggen weniger, wenn keine Kommunikation besteht.)
import codecs
for line in readlines():
print(line)
def readlines():
file f = sftp_connection.open(Dateipfad, "rb")
return codecs.encode(f.read(), "ANSI").split("\r\n")
Durch Angabe von "rb" für die zweite Variable von open wird die Datei als Binärdatei gelesen. Ich lese es erneut mit der Codierung, die ich lesen möchte, und gebe dann die Zeile zurück.
Wenn die Datei zu groß ist, scheint es ein Problem zu geben, aber es scheint, dass es im praktischen Gebrauch kein Problem gibt, also war es diesmal in Ordnung.
Ich denke, die Hauptursache für dieses Problem ist, dass paramikos BufferedFile die Codierung angibt.
Es ist eine gute Gelegenheit, es richtig zu lesen, und ich möchte eine Pull-Anfrage an Paramikos Github senden.
Recommended Posts