2011-03-30 29 views
42

Estoy usando python 2.6.5 Quiero escribir algunos caracteres japoneses en un archivo. Recibo este error & No sé cómo cambiar la codificación.Cómo escribir cadenas unicode en un archivo?

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'> 

Respuesta

65

vas a tener que 'codificar' la cadena Unicode.

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

probar esto para un poco de un aspecto agradable en Unicode y Python: http://farmdev.com/talks/unicode/

66

Como alternativa, puede utilizar el módulo codecs:

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

Gracias por la sugerencia. –

9

La función codecs.open() en 2.6 es muy similar a la función incorporada open() en python3.x (lo cual tiene sentido ya que las cadenas Py3k son siempre Unicode). Para futuras pruebas de su código en caso de que se use bajo Py3k, podría hacer lo siguiente.

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') 

Ahora su código debería funcionar igual en ambos 2.xy 3.3+.

+7

lol "hacer una copia de seguridad, por si acaso" –

3

Insertar esto al principio de mi script tiende a resolver problemas de Unicode.

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

Me sorprende que esta no haya sido la respuesta aceptada. Muy simple, y realmente resuelve problemas Unicode –

+0

@HomunculusReticulli: (1) es un consejo terrible en general (2) No responde la pregunta: * "¿Cómo escribir cadenas unicode en un archivo?" * – jfs

+0

¿Es esto? solo Python 2? ¿Hay un equivalente de Python 3.x? –

Cuestiones relacionadas