54 votes

Comment écrire des chaînes Unicode dans un fichier?

Je suis en train d'utiliser python 2.6.5 Je veux écrire quelques caractères japonais dans un fichier. Je reçois cette erreur et je ne sais pas comment changer l'encodage.

Python 2.6.5 (r265:79063, Jun 12 2010, 17:07:01)
[GCC 4.3.4 20090804 (release) 1] on cygwin
>>> s = u'\u5E73\u621015'
>>> with open("yop", "wb") as f:
...   f.write( s + "\n" );
...
Traceback (most recent call last):
  File "", line 2, in 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: 
  ordinal not in range(128)
>>> type( s )

82voto

Mike Ramirez Points 3528

Vous allez devoir 'encoder' la chaîne unicode.

s = u'\u5E73\u621015'
with open("yop", "wb") as f:
   f.write(s.encode("UTF-8"))

Essayez ceci pour avoir un aperçu convivial des Unicode et de Python : http://farmdev.com/talks/unicode/

76voto

Philipp Points 21479

En alternative, vous pouvez utiliser le module codecs :

import codecs
s = u'\u5E73\u621015'
with codecs.open("yop", "w", encoding="utf-8") as f:
    f.write(s)

11voto

eestrada Points 136

La fonction codecs.open() en 2.6 est très similaire à la fonction intégrée open() en python3.x (ce qui a du sens puisque les chaînes Py3k sont toujours Unicode). Pour garantir la compatibilité future de votre code au cas où il serait utilisé sous Py3k, vous pourriez faire ce qui suit.

import sys

if sys.version_info[0] < 3:
    import codecs
    _open_func_bak = open # Faire une sauvegarde, juste au cas où
    open = codecs.open

with open('myfile', 'w', encoding='utf-8') as f:
    f.write(u'\u5E73\u621015')

Maintenant votre code devrait fonctionner de la même manière en 2.x et en 3.3+.

5voto

petra Points 161

Insérer ceci au début de mon script semble résoudre les problèmes d'unicode.

import sys
reload(sys)
sys.setdefaultencoding('utf8')

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