2010-02-03 22 views
6

如何在Python中強制使用Latin-1(我猜意味着iso-8859-1?)文件輸出?Python:我如何強制iso-8859-1文件輸出?

這是我目前的代碼。它的工作原理是,但試圖將生成的輸出文件導入到Latin-1 MySQL表中,生成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() 

生成的輸出文件似乎要保存「西文(Mac OS羅馬)」,但如果我然後將其保存在拉丁美洲-1,我還是得到了奇怪的編碼問題。我怎樣才能確保所使用的字符串和文件本身在生成後立即用Latin-1編碼?

原始字符串(在textData字典中)已經從RTF文件中解析出來 - 我不知道這是否有所作爲。

我對Python和一般編碼有點新,所以如果這是一個愚蠢的問題,請道歉。我曾嘗試查看文檔,但並沒有太多。

我正在使用Python 2.6.1。

回答

10

只需使用codecs模塊寫入文件:

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

當然,你寫的字符串必須是Unicode字符串(類型unicode),他們將不會被轉換,如果他們是普通str對象(它們基本上只是字節數組)。我猜你正在用普通的Python文件對象讀取RTF文件,所以你可能不得不將它轉換爲使用codecs.open

0

我認爲這只是:

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

至於你提到,你需要確保你正確太解碼RTF文件。爲此,k和v應該是unicode對象。

+0

謝謝。我剛剛嘗試了這段代碼,但是得到:「UnicodeDecodeError:'ascii'編解碼器無法解碼位置753中的字節0xa3:序號不在範圍(128)中」。如上所示,我現在嘗試確保k和v是unicode對象。 – AP257

0

這裏的主要問題是,你不知道你的數據是什麼編碼。如果我們假設你的文件最終在Mac OS Roman中是正確的,那麼你需要首先解碼數據到unicode ,然後將其編碼爲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() 

但是我不會感到驚訝,因爲它是RTF,如果它是Windows編碼的,所以你可能也想試試。我不知道RTF如何指定編碼。

+0

如果您使用r而不是rb,則Windows會將\ r \ n改爲\ r(包括Python 2.6)。 –

+0

從文檔:「將'b'添加到以二進制模式打開文件的模式,在區分二進制文本文件和系統文本文件的系統上;在沒有此區別的系統上,添加'b'不起作用。 「在Unix上使用b或t(或不使用它們)完全沒有區別。你可能會想到「U」,這是通用的換行符。*它* maches行結束(從未有寫在!) 什麼系統區分文本和二進制文件我不知道。 Unix肯定不會。 –

0

對於我來說,io.open工作快一點關於Python 2.7的寫入,以及一個量級更快讀取:

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

在Python 3,你可以pass the encoding keyword arg to open