54 votes

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

J'utilise python 2.6.5. Je veux écrire des caractères japonais dans un fichier. J'obtiens 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 "<stdin>", line 2, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: 
  ordinal not in range(128)
>>> type( s )
<type 'unicode'>

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 un regard amical sur l'unicode et python : http://farmdev.com/talks/unicode/

76voto

Philipp Points 21479

Comme alternative, vous pouvez utiliser l'option codecs module :

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

11voto

eestrada Points 136

El codecs.open() en 2.6 est très similaire à la fonction intégrée ouvrir() dans python3.x (ce qui est logique puisque les chaînes Py3k sont toujours Unicode). Pour préparer votre code au cas où il serait utilisé sous Py3k, vous pouvez faire ce qui suit.

import sys

if sys.version_info[0] < 3:
    import codecs
    _open_func_bak = open # Make a back up, just in case
    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 dans les versions 2.x et 3.3+.

5voto

petra Points 161

Insérer ceci au début de mon script tend à 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