Une histoire à laquelle j'étais accro après la communication SFTP avec python

Aperçu

Soyez prudent car certaines bibliothèques à l'étranger ont une idée appropriée de l'encodage.

Contenu de problème

Pour les affaires, j'avais besoin de toucher sftp avec python, j'ai donc utilisé paramiko et essayé de télécharger le fichier directement à partir du serveur FTP et d'appliquer le fichier texte à l'intérieur pour le traitement statistique. Dans la documentation API, "la fonction file () peut être utilisée dans le même but que le fichier python". Par conséquent, lorsque j'ai spécifié le chemin, etc. de manière appropriée, l'erreur suivante est apparue.

UnicodeDecodeError: 'utf-8' codec can't decode byte ~~ in position ~~: invalid start byte

Le code ressemble à ce qui suit.


client = paramiko.SSHClient()
client.connect(Informations de connexion appropriées)
sftp_connection = client.open_sftp()

with sftp_connection.open(Chemin du fichier) as f
    for line in f:
        print(line)

Quand j'ai fait cela, j'ai eu un UnicodeDecodeError près de l'instruction for.

Cause

En un mot, c'était «parce que vous ne pouvez pas spécifier le codage lors de la récupération du contenu d'un fichier». J'essaye de lire un fichier texte encodé en ANSI avec UTF-8 et j'obtiens une erreur. J'ai regardé la source, mais pour le moment je ne peux pas spécifier l'encodage lors de l'ouverture. Je peux le faire avec une entrée standard.

solution de contournement

Il semble que le contenu du fichier ne puisse pas être réécrit en anglais ou recréé avec utf, donc cette fois j'ai décidé de l'ouvrir en binaire et de l'encoder séparément avec ANSI pour le lire. Plus précisément, ce qui suit avec l'instruction dans le code ci-dessus a été réécrit avec l'image suivante. (La raison pour laquelle cela ressemble à une entrée standard dans une certaine mesure est que je voulais pouvoir déboguer localement au lieu de sftp. Bien sûr, le débogage prend moins de temps s'il n'y a pas de communication.)

import codecs

for line in readlines():
    print(line)

def readlines():
    file f = sftp_connection.open(Chemin du fichier, "rb")
    return codecs.encode(f.read(), "ANSI").split("\r\n")

En spécifiant "rb" pour la deuxième variable d'ouverture, le fichier est lu comme un binaire. Je le relis avec l'encodage que je veux lire, puis je renvoie la ligne.

Si le fichier est trop gros, il semble y avoir un problème, mais il semble qu'il n'y ait pas de problème d'utilisation pratique, donc cette fois c'était OK.

Cause première

Je pense que la cause première de ce problème est que le BufferedFile de paramiko spécifie l'encodage.

C'est une bonne occasion de le lire correctement, et je veux envoyer une pull request au github de paramiko.

Recommended Posts

Une histoire à laquelle j'étais accro après la communication SFTP avec python
Une histoire à laquelle j'étais accro chez np.where
Une note à laquelle j'étais accro lors de l'exécution de Python avec Visual Studio Code
Une histoire qui a trébuché lorsque j'ai créé un bot de chat avec Transformer
Une histoire à laquelle j'étais accro à appeler Lambda depuis AWS Lambda.
Une note à laquelle j'étais accro lors de la création d'une table avec SQL Alchemy
J'étais accro à la création d'un environnement Python venv avec VS Code
Une histoire à laquelle j'étais accro à essayer d'obtenir une URL de vidéo avec tweepy
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
Lors de l'écriture dans un fichier csv avec python, une histoire que j'ai fait une légère erreur et n'a pas respecté la date de livraison
J'étais accro au grattage avec Selenium (+ Python) en 2020
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
[Python] Quand j'ai essayé de créer un outil de décompression avec un fichier zip que je connaissais juste, j'étais accro à sys.exit ()
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai créé un package pour filtrer les séries chronologiques avec python
Ce à quoi j'étais accro lorsque l'utilisateur de traitement est passé à Python
Une histoire qui était pratique lorsque j'ai essayé d'utiliser le module d'adresse IP python
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Une histoire sur l'ajout d'une API REST à un démon créé avec Python
Ce à quoi j'étais accro en présentant ALE à Vim pour Python
Ce à quoi j'étais accro avec json.dumps dans l'encodage base64 de Python
Une note à laquelle j'étais accro lors de l'émission d'un bip sous Linux
Ce à quoi j'étais accro en traitant d'énormes fichiers dans un environnement Linux 32 bits
Une histoire qui a disparu quand j'ai spécifié un chemin commençant par tilda (~) en python open
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu rogue-like avec Python
Ce que j'étais accro à Python autorun
Une histoire à laquelle j'étais accro en spécifiant nil comme argument de fonction dans Go
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
Quand j'ai essayé de gratter en utilisant des requêtes en python, j'étais accro à SSLError, donc un mémo de contournement
On m'a dit que je ne pouvais pas trouver XML_SetHashSalt lorsque j'ai essayé d'utiliser pip avec python.
Notez que j'étais accro à accéder à la base de données avec mysql.connector de Python en utilisant une application Web
[Python] J'ai fait un décorateur qui ne semble pas avoir d'utilité.
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
J'ai créé une application Web en Python qui convertit Markdown en HTML
Une histoire à laquelle j'étais accro à essayer d'installer LightFM sur Amazon Linux
J'ai créé un bot Discord en Python qui se traduit quand il réagit
Utilisez Python de Java avec Jython. J'étais aussi accro.
J'obtiens un UnicodeDecodeError en essayant de me connecter à oracle avec python sqlalchemy
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
J'étais accro à essayer Cython avec PyCharm, alors prenez note
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Je veux faire un jeu avec Python
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.