2015-02-11 48 views
1

我想解析一個日誌文件,但文件格式總是在unicode。我想要自動化的通常過程:Python 3的Unicode到UTF-8的文件

  • I pull file up in notepad
  • Save as...
  • change encoding from unicode to UTF-8
  • Then run python program on it

所以這是我想在Python 3.4中自動化的過程。非常簡單,只是改變了文件UTF-8或類似open(filename,'r',encoding='utf-8')雖然這個確切的行被扔我這個錯誤,當我試圖調用read()就可以了:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte 

這將是非常有益的,如果我可以轉換整個文件(就像在我的第一個場景中一樣),或者用UTF-8打開整個文件,這樣我就不必在每次分析字符串時都str.encode(或類似的東西)。

有人通過這個,知道我應該使用哪種方法以及如何去做?

編輯:

在python3再版,我做

>>> f = open('file.txt','r') 
>>> f 
(_io.TextIOWrapper name='file.txt' mode='r' encoding='cp1252') 

所以,現在在我的計劃我的Python代碼將打開open('file.txt','r',encoding='cp1252')文件。我正在運行很多正則表達式來查看這個文件,但它並沒有選擇它(我認爲它不是utf-8)。所以我只需要弄清楚如何從cp1252切換到UTF-8。謝謝@Mark Ransom

+1

您需要確定原始文件的編碼,並在打開文件時使用該編碼,而不是'utf-8'。 – 2015-02-11 20:20:18

+0

我該怎麼做?因爲當我在記事本中保存時,它只是說unicode – Jeremy 2015-02-11 20:33:00

+0

好吧,我已經差不多了!在python3 repr中我發現文件的編碼是cp1252。現在我想我必須在打開文件後立即將其轉換爲utf-8 – Jeremy 2015-02-11 21:18:10

回答

4

記事本認爲Unicodeutf16 Python。 Windows「Unicode」文件以字節順序標記(BOM)FF FE開頭,表示小端UTF-16。這就是爲什麼你會得到如下使用utf8當對文件進行解碼:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

要轉換爲UTF-8,你可以使用:

with open('log.txt',encoding='utf16') as f: 
    data = f.read() 
with open('utf8.txt','w',encoding='utf8') as f: 
    f.write(data) 

注意,許多Windows編輯器就像一個UTF-8在文件開始處簽名,或者可以採用ANSI代替。 ANSI真的是當地的語言環境。在美國的Windows上,它是cp1252,但對於其他本地化版本而言會有所不同。如果您打開utf8.txt並且它看起來仍然顯示爲亂碼,請改爲使用encoding='utf-8-sig'