252 votes

Python: écrire du texte Unicode dans un fichier texte?

Je suis de l'extraction de données d'un Google doc, de le traiter et de les écrire dans un fichier (que finalement je vais la coller dans une page Wordpress).

Il a une certaine non-ASCII symboles. Comment puis-je les convertir en toute sécurité à des symboles qui peuvent être utilisés dans la source HTML?

Actuellement, je suis à la conversion tout en Unicode sur la façon de le, rejoindre tous ensemble dans une chaîne Python, puis de le faire:

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 de codage sur la dernière ligne:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in 
position 12286: ordinal not in range(128)

Solution partielle:

Ce python 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 alors, si j'ouvre le texte du fichier, je vois beaucoup de symboles comme:

Qur’an 

Peut-être que j'ai besoin d'écrire quelque chose d'autre qu'un fichier texte?

343voto

quasistoic Points 1795

Traitez exclusivement les objets unicode autant que possible en décodant les objets en 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 réalité un objet Unicode, vous devrez le convertir en objet chaîne codé en Unicode avant de l'écrire dans un fichier:

 foo = u'Δ, Й, ק, ‎ م, ๗, あ, 叶, 葉, and 말.'
f = open('test', 'w')
f.write(foo.encode('utf8'))
f.close()
 

Lorsque vous relisez ce fichier, vous obtenez une chaîne codée en Unicode que vous pouvez décoder en un objet Unicode:

 f = file('test', 'r')
print f.read().decode('utf8')
 

19voto

Thomas Wouters Points 38811

Le fichier est ouvert en codecs.open est un fichier qui prend en unicode données, l'encode en iso-8859-1 et l'écrit dans le fichier. Cependant, ce que vous essayez d'écrire n'est pas unicode; vous prenez unicode et l'encoder en iso-8859-1 vous-même. C'est ce que l' unicode.encode méthode n', et le résultat de l'encodage d'une chaîne unicode est un bytestring ( str type.)

Vous devez utiliser la normale open() et de coder l'unicode vous-même, ou (généralement une meilleure idée) utiliser codecs.open() et pas de coder les données vous-même.

3voto

nwaomachux Points 570

Obtenez plus de détails sur http://pythonhosted.org/kitchen/unicode-frustrations.html . Je pense que cela devrait être utile.

3voto

Eric Leschinski Points 14289

Comment imprimer des caractères Unicode dans un fichier:

Enregistrez ceci dans le fichier: foo.py:

 #!/usr/bin/python -tt
# -*- coding: utf-8 -*-
import codecs
import sys 
UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)
print(u'e with obfuscation: é')
 

Exécutez-le et dirigez la sortie vers le fichier:

 python foo.py > tmp.txt
 

Ouvrez tmp.txt et regardez à l'intérieur, vous voyez ceci:

 el@apollo:~$ cat tmp.txt 
e with obfuscation: é
 

Ainsi, vous avez enregistré unicode e avec une marque d'obscurcissement dans un fichier.

1voto

Thomas K Points 16753

Cette erreur survient lorsque vous essayez d’encoder une chaîne non unicode: elle essaie de la décoder, en supposant qu’elle se trouve en clair ASCII. Il y a deux possibilités:

  1. Vous êtes en train de l'encoder en un bytestring, mais comme vous avez utilisé codecs.open, la méthode write attend un objet unicode. Donc, vous l'encodez, et il essaie de le décoder à nouveau. Essayez plutôt: f.write(all_html) .
  2. En fait, all_html n'est pas un objet Unicode. Lorsque vous faites .encode(...) , il essaie d'abord de le décoder.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X