web-dev-qa-db-fra.com

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'>
52
Frankie Ribery

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 peu de convivialité sur unicode et python: http://farmdev.com/talks/unicode/

80
Mike Ramirez

Comme 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)
72
Philipp

La fonction codecs.open () dans 2.6 est très similaire à la fonction intégrée open () dans python3.x (ce qui est logique puisque les chaînes Py3k sont toujours Unicode). Pour une vérification future de votre code au cas où il serait utilisé sous Py3k, vous pouvez effectuer les opérations suivantes.

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 façon dans les versions 2.x et 3.3+.

10
eestrada

L'insérer au début de mon script tend à résoudre les problèmes Unicode.

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