2010-02-03 18 views
6

Come faccio a forzare l'output di Latin-1 (che suppongo significhi iso-8859-1?) In Python?Python: Come posso forzare l'output del file iso-8859-1?

Ecco il mio codice al momento. Funziona, ma il tentativo di importare il file di output risultante in una tabella MySQL Latin-1 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() 

Il file di output risultante sembra essere salvati in "occidentale (Mac OS romana)", ma se poi salvarlo in Latin-1, ho ancora problemi di codifica strani. Come posso assicurarmi che le stringhe utilizzate e il file stesso siano tutti codificati in Latin-1 non appena vengono generati?

Le stringhe originali (nel dizionario textData) sono state analizzate da un file RTF: non so se questo faccia la differenza.

Sono un po 'nuovo per Python e per la codifica in generale, quindi scuse se questa è una domanda stupida. Ho provato a guardare i documenti ma non sono arrivato molto lontano.

Sto usando Python 2.6.1.

risposta

10

Basta utilizzare il modulo codecs per scrivere il file:

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

Naturalmente, le corde che scrivete devono essere stringhe Unicode (tipo unicode), non saranno convertite se sono semplici oggetti str (che sono fondamentalmente solo array di byte). Immagino che stai leggendo il file RTF con il normale oggetto file Python, quindi potresti doverlo convertire in codecs.open.

0

Penso che sia solo:

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

Come accennato, è necessario assicurarsi che si sta decodifica il file RTF correttamente troppo. Perché funzioni, k e v dovrebbero essere oggetti unicode.

+0

Grazie. Ho appena provato questo codice, ma ho ottenuto: "UnicodeDecodeError: il codec 'ascii' non può decodificare il byte 0xa3 nella posizione 753: ordinale non nel range (128)". Ora cercherò di assicurarmi che k e v siano oggetti unicode, come suggerito sopra. – AP257

0

Il problema principale qui è che non si sa cosa sia la codifica dei dati. Se si assume che il file sia corretto in Mac OS Roman, è necessario decodificare prima i dati per unicode e quindi codificarlo come 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() 

Ma io non sarei sorpreso, dal momento che è RTF, se è codificato di Windows, così si potrebbe desiderare di provare anche questo. Non so come RTF specifica la codifica.

+0

Se si usa r invece di rb, Windows verrà distrutto \ r \ n in \ r (incluso in Python 2.6). –

+0

Dalla documentazione: "Aggiungi 'b' alla modalità per aprire il file in modalità binaria, su sistemi che distinguono tra file binari e di testo, su sistemi che non hanno questa distinzione, l'aggiunta della 'b' non ha alcun effetto. " Avere b o t (o nessuno di loro) non fa alcuna differenza su Unix. Potresti pensare a "U", che è newlines universale.* It * maches line-endings (mai U in scrittura!) Quali sistemi che distinguono tra file di testo e binari non so. Unix sicuramente no. –

0

Per me, io.open funziona un po 'più veloce su Python 2.7 in scrittura, e un ordine di grandezza più veloce per la legge:

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

In Python 3, si può semplicemente pass the encoding keyword arg to open.

Problemi correlati