J'extrais des données d'un document Google, je les traite et je les écris dans un fichier (que je finirai par coller dans une page Wordpress).
Il contient des symboles non ASCII. Comment puis-je les convertir en toute sécurité en symboles pouvant être utilisés dans une source HTML?
Actuellement, je convertis tout en Unicode en cours de route, je rassemble le tout dans une chaîne Python, puis je fais:
import codecs
f = codecs.open('out.txt', mode="w", encoding="iso-8859-1")
f.write(all_html.encode("iso-8859-1", "replace"))
Il y a une erreur d'encodage sur la dernière ligne:
UnicodeDecodeError: le codec 'ascii' ne peut pas décoder l'octet 0xa0 en position 12286: l'ordinal n'est pas dans la plage (128)
Solution partielle:
Ce Python s'exécute sans erreur:
row = [unicode(x.strip()) if x is not None else u'' for x in row]
all_html = row[0] + "<br/>" + row[1]
f = open('out.txt', 'w')
f.write(all_html.encode("utf-8"))
Mais ensuite, si j'ouvre le fichier texte réel, je vois beaucoup de symboles comme:
Qur’an
Peut-être que je dois écrire dans autre chose qu'un fichier texte?
Réponses:
Traitez exclusivement les objets unicode autant que possible en décodant les choses en objets unicode lorsque vous les obtenez pour la première fois et en les encodant si nécessaire à la sortie.
Si votre chaîne est en fait un objet Unicode, vous devrez la convertir en un objet chaîne codé Unicode avant de l'écrire dans un fichier:
Lorsque vous relisez ce fichier, vous obtenez une chaîne codée en unicode que vous pouvez décoder en un objet unicode:
la source
Dans Python 2.6+, vous pouvez utiliser la
io.open()
valeur par défaut ( intégréeopen()
) sur Python 3:Cela peut être plus pratique si vous devez écrire le texte de manière incrémentielle (vous n'avez pas besoin d'appeler
unicode_text.encode(character_encoding)
plusieurs fois). Contrairement aucodecs
module, leio
module a un support universel approprié pour les nouvelles lignes.la source
La gestion des chaînes Unicode est déjà standardisée dans Python 3.
Il vous suffit d'ouvrir le fichier dans utf-8
(la conversion d'Unicode 32 bits en utf-8 de longueur variable est automatiquement effectuée de la mémoire vers le fichier.)
la source
Le fichier ouvert par
codecs.open
est un fichier qui prend desunicode
données, les encodeiso-8859-1
et les écrit dans le fichier. Cependant, ce que vous essayez d'écrire ne l'est pasunicode
; vous le prenezunicode
et le codez eniso-8859-1
vous-même . C'est ce que fait launicode.encode
méthode, et le résultat de l'encodage d'une chaîne unicode est un bytestring (unstr
type.)Vous devez soit utiliser normal
open()
et encoder vous-même l'unicode, soit (généralement une meilleure idée) utilisercodecs.open()
et non encoder les données vous-même.la source
Préface: votre spectateur fonctionnera-t-il?
Assurez-vous que votre visionneuse / éditeur / terminal (quelle que soit la manière dont vous interagissez avec votre fichier encodé utf-8) peut lire le fichier. Il s'agit souvent d'un problème sous Windows , par exemple, le Bloc-notes.
En Python 2, utilisez à
open
partir duio
module (c'est le même que celui intégréopen
dans Python 3):Meilleure pratique, en général, utilisée
UTF-8
pour écrire dans des fichiers (nous n'avons même pas à nous soucier de l'ordre des octets avec utf-8).utf-8 est l'encodage le plus moderne et universellement utilisable - il fonctionne dans tous les navigateurs Web, la plupart des éditeurs de texte (voir vos paramètres si vous avez des problèmes) et la plupart des terminaux / shells.
Sous Windows, vous pouvez essayer
utf-16le
si vous êtes limité à l'affichage de la sortie dans le Bloc-notes (ou une autre visionneuse limitée).Et ouvrez-le avec le gestionnaire de contexte et écrivez vos caractères unicode:
Exemple utilisant de nombreux caractères Unicode
Voici un exemple qui tente de mapper tous les caractères possibles jusqu'à trois bits de large (4 est le maximum, mais cela irait un peu loin) de la représentation numérique (en nombres entiers) à une sortie imprimable codée, ainsi que son nom, si possible (mettez ceci dans un fichier appelé
uni.py
):Cela devrait s'exécuter dans l'ordre d'une minute environ, et vous pouvez afficher le fichier de données, et si votre visionneuse de fichiers peut afficher unicode, vous le verrez. Informations sur les catégories peuvent être trouvées ici . Sur la base des décomptes, nous pouvons probablement améliorer nos résultats en excluant les catégories Cn et Co, auxquelles aucun symbole ne leur est associé.
Il affichera le mappage hexadécimal, la catégorie , le symbole (à moins qu'il ne puisse pas obtenir le nom, donc probablement un caractère de contrôle), et le nom du symbole. par exemple
Je recommande
less
sur Unix ou Cygwin (n'imprimez pas / ne cattez pas le fichier entier à votre sortie):par exemple, affichera similaire aux lignes suivantes que j'ai échantillonnées à partir de celui-ci en utilisant Python 2 (unicode 5.2):
Mon Python 3.5 d'Anaconda a unicode 8.0, je suppose que la plupart des 3 le feraient.
la source
Comment imprimer des caractères Unicode dans un fichier:
Enregistrez-le dans le fichier: foo.py:
Exécutez-le et dirigez la sortie vers le fichier:
Ouvrez tmp.txt et regardez à l'intérieur, vous voyez ceci:
Ainsi, vous avez enregistré unicode e avec une marque d'obscurcissement dessus dans un fichier.
la source
Cette erreur se produit lorsque vous essayez de coder une chaîne non unicode: il essaie de la décoder, en supposant qu'elle soit en ASCII ordinaire. Il y a deux possibilités:
f.write(all_html)
place..encode(...)
, il essaie d'abord de le décoder.la source
En cas d'écriture en python3
En cas d'écriture en python2:
Pour éviter cette erreur, vous devez le coder en octets en utilisant les codecs "utf-8" comme ceci:
et décoder les données lors de la lecture en utilisant les codecs "utf-8":
Et aussi si vous essayez d'exécuter l'impression sur cette chaîne, elle se décodera automatiquement en utilisant les codecs "utf-8" comme celui-ci
la source