Soyez prudent car certaines bibliothèques à l'étranger ont une idée appropriée de l'encodage.
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.
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.
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.
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