Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war

Überblick

Seien Sie vorsichtig, da einige Bibliotheken in Übersee eine angemessene Vorstellung von der Codierung haben.

Fehlerinhalt

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.

Ursache

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.

Problemumgehung

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.

Ursache

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

Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Eine Geschichte, von der ich bei np.where süchtig war
Ein Hinweis, dem ich beim Ausführen von Python mit Visual Studio Code verfallen war
Eine Geschichte, die stolperte, als ich mit Transformer einen Chat-Chat-Bot erstellte
Eine Geschichte, die ich süchtig danach war, Lambda von AWS Lambda anzurufen.
Ein Hinweis, dem ich beim Erstellen einer Tabelle mit SQL Alchemy verfallen war
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
Eine Geschichte, die ich süchtig danach war, eine Video-URL mit Tweepy zu bekommen
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Beim Schreiben in eine CSV-Datei mit Python habe ich einen kleinen Fehler gemacht und den Liefertermin nicht eingehalten
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
Wovon ich süchtig war, als ich Python Tornado benutzte
Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete
[Python] Als ich versuchte, ein Dekomprimierungswerkzeug mit einer Zip-Datei zu erstellen, die ich gerade kannte, war ich süchtig nach sys.exit ()
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Wovon ich süchtig war, als der Processing-Benutzer zu Python wechselte
Eine Geschichte, die praktisch war, als ich versuchte, das Python-IP-Adressmodul zu verwenden
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Wovon ich süchtig war, als ich ALE in Vim für Python einführte
Was ich mit json.dumps in Pythons base64-Codierung süchtig gemacht habe
Ein Hinweis, von dem ich süchtig war, als ich unter Linux einen Piepton machte
Wovon ich süchtig war, als ich mit riesigen Dateien in einer Linux 32-Bit-Umgebung umging
Eine Geschichte, die verschwunden ist, als ich einen Pfad angegeben habe, der mit tilda (~) in Python Open beginnt
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
Ich habe mit Python eine Hex-Map erstellt
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Was ich süchtig nach Python Autorun war
Eine Geschichte, nach der ich süchtig war, als ich in Go nil als Funktionsargument angab
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
Als ich versuchte, mithilfe von Anforderungen in Python zu kratzen, war ich süchtig nach SSLError, also einem Workaround-Memo
Mir wurde gesagt, dass ich XML_SetHashSalt nicht finden konnte, als ich versuchte, pip mit Python zu verwenden.
Beachten Sie, dass ich süchtig danach war, mit Pythons mysql.connector über eine Webanwendung auf die Datenbank zuzugreifen
[Python] Ich habe einen Dekorateur gemacht, der keinen Nutzen zu haben scheint.
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Ich habe ein Tool zum automatischen Durchsuchen mehrerer Websites mit Selenium (Python) erstellt.
Ich habe eine Webanwendung in Python erstellt, die Markdown in HTML konvertiert
Eine Geschichte, die mich süchtig nach dem Versuch machte, LightFM unter Amazon Linux zu installieren
Ich habe in Python einen Discord-Bot erstellt, der übersetzt, wenn er reagiert
Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
Ich erhalte einen UnicodeDecodeError, wenn ich versuche, mit Python sqlalchemy eine Verbindung zu Oracle herzustellen
Ich habe ein Tool erstellt, das die Dekomprimierung mit CLI (Python3) etwas erleichtert.
Ich war süchtig danach, Cython mit PyCharm auszuprobieren, also machen Sie sich eine Notiz
Ich habe ein Modul PyNanaco erstellt, das Nanaco-Guthaben mit Python belasten kann
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Ich möchte ein Spiel mit Python machen
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.