2010-02-03 16 views
6

¿Cómo fuerzo Latin-1 (que supongo significa iso-8859-1?) Salida de archivo en Python?Python: ¿Cómo fuerzo la salida del archivo iso-8859-1?

Aquí está mi código por el momento. Funciona, pero intentar importar el archivo de salida resultante en una tabla Latin-1 MySQL produce weird encoding errors.

outputFile = file("textbase.tab", "w") 
for k, v in textData.iteritems(): 
    complete_line = k + '~~~~~' + v + '~~~~~' + " ENDOFTHELINE" 
    outputFile.write(complete_line) 
    outputFile.write("\n") 
outputFile.close() 

El archivo de salida resultante parece estar guardado en "occidental (Mac OS Romano)", pero si luego guardarlo en América-1, sigo teniendo problemas de codificación extrañas. ¿Cómo puedo asegurarme de que las cadenas utilizadas y el archivo en sí estén codificados en Latin-1 tan pronto como se generan?

Las cadenas originales (en el diccionario textData) han sido analizadas desde un archivo RTF; no sé si eso hace la diferencia.

Soy un poco nuevo en Python y para la codificación en general, así que me disculpo si esta es una pregunta tonta. He intentado mirar los documentos pero no he llegado muy lejos.

Estoy usando Python 2.6.1.

Respuesta

10

Sólo tiene que utilizar el módulo codecs para escribir el archivo:

import codecs 
outputFile = codecs.open("textbase.tab", "w", "ISO-8859-1") 

Por supuesto, las cadenas que escribe tiene que ser cadenas Unicode (tipo unicode), no van a ser convertidos si son lisos str objetos (que son básicamente solo matrices de bytes). Supongo que también está leyendo el archivo RTF con el objeto de archivo Python normal, por lo que es posible que también tenga que convertirlo en codecs.open.

0

Creo que es justo:

outputFile = file("textbase.tab", "wb") 
for k, v in textData.iteritems(): 
    complete_line = k + '~~~~~' + v + '~~~~~' + " ENDOFTHELINE" 
    outputFile.write((complete_line + "\n").encode("iso-8859-1")) 
    outputFile.close() 

Como aludido, es necesario asegurarse de que está decodificando el archivo RTF correctamente también. Para que esto funcione, k y v deben ser objetos unicode.

+0

Gracias. Acabo de probar este código, pero obtengo: "Códec UnicodeDecodeError: 'ascii' no puede decodificar byte 0xa3 en la posición 753: ordinal no en rango (128)". Ahora intentaré asegurarme de que k y v sean objetos unicode, como se sugirió anteriormente. – AP257

0

El principal problema aquí es que no sabe en qué codificación están sus datos. Si asumimos que tiene razón en que su archivo termina en Mac OS Roman, primero debe decodificar los datos para unicode , y luego codificarlo como iso-8859-1.

inputFile = open("input.rtf", "rb") # The b flag is just a marker in Python 2. 
data = inputFile.read().decode('mac_roman') 
textData = yourparsefunctionhere(data) 

outputFile = open("textbase.tab", "wb") # don't use file() 
for k, v in textData.iteritems(): 
    complete_line = k + '~~~~~' + v + '~~~~~' + " ENDOFTHELINE" 
    outputFile.write((complete_line + "\n").encode("iso-8859-1")) 
    outputFile.close() 

Pero no me sorprendería, ya que es RTF, si es codificado de Windows, por lo que es posible que desee probar eso también. No sé cómo RTF especifica la codificación.

+0

Si usa r en lugar de rb, Windows modificará \ r \ n a \ r (incluido en Python 2.6). –

+0

De los documentos: "Agregar 'b' al modo para abrir el archivo en modo binario, en los sistemas que diferencian entre archivos binarios y de texto, en los sistemas que no tienen esta distinción, agregar la 'b' no tiene ningún efecto. " Tener b o t (o ninguno de ellos) no hace ninguna diferencia en Unix. Usted puede estar pensando en "U", que son nuevas líneas universales.* It * maches line-endings (¡nunca ha escrito U!) Qué sistemas no distinguen entre archivos de texto y binarios. Unix seguro que no. –

0

Para mí io.open, trabaja un poco más rápido en Python 2.7 para las escrituras, y un orden de magnitud más rápido para lecturas:

import io 
with io.open("textbase.tab", "w", encoding="ISO-8859-1") as outputFile: 
    ... 

en Python 3, sólo puede pass the encoding keyword arg to open.

Cuestiones relacionadas