2009-08-05 68 views
1

設置

我正在編寫腳本來處理和註釋從Visual Studio構建日誌。構建日誌是HTML,並且從我可以告訴的是,Unicode(UTF-16?)也是如此。下面是從文件中的一個片段:使用Python搜索Unicode文件

c:\anonyfolder\anonyfile.c(17169) : warning C4701: potentially uninitialized local variable 'object_adrs2' used
c:\anonyfolder\anonyfile.c(17409) : warning C4701: potentially uninitialized local variable 'pclcrd_ptr' used
c:\anonyfolder\anonyfile.c(17440) : warning C4701: potentially uninitialized local variable 'object_adrs2' used

的前16個字節的文件看起來像這樣的:

feff 003c 0068 0074 006d 006c 003e 000d

文件的其餘部分散落着空字節爲好。

我希望能夠對這些文件執行字符串和正則表達式搜索/匹配。但是,當我嘗試下面的代碼時,我收到一條錯誤消息。

buildLog = open(sys.argv[1]).readlines() 

for line in buildLog: 
    match = u'warning' 
    if line.find(match) >= 0: 
     print line 

錯誤消息:

Traceback (most recent call last):
File "proclogs.py", line 60, in
if line.find(match) >= 0:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)

顯然它窒息了0xff字節0xfeff在文件的開頭。如果我跳過第一行,我沒有得到任何比賽:

buildLog = open(sys.argv[1]).readlines() 

for line in buildLog[1:]: # Skip the first line. 
    match = u'warning' 
    if line.find(match) >= 0: 
     print line 

同樣,使用非Unicode match = 'warning'產生任何結果。

問題

我如何可移植性搜索使用字符串和正則表達式Python中的Unicode文件?另外,我該怎麼做才能重建原始文件? (我們的目標是能夠寫上警示線註解沒有重整的文件)使用的編解碼器包

+0

您是否試過按照下面的建議添加一個調用decode()? – hughdbrown 2009-08-05 21:37:04

+0

你在使用python 3.x或者某些2.x版本嗎?如果前者,你會得到字符串作爲unicode。 – hughdbrown 2009-08-05 21:38:35

+0

我撤回我的答案。我嘗試了Alexander Ljungberg的回答,它完美地工作。 – hughdbrown 2009-08-05 21:45:05

回答

7

嘗試:

import codecs 
buildLog = codecs.open(sys.argv[1], "r", "utf-16").readlines() 

你也可能會遇到麻煩你print語句,因爲它可能嘗試將字符串轉換爲您的控制檯編碼。如果你打印你的評論,你可以使用,

print repr(line) 
+0

謝謝,這正是我需要的。假設我運行UTF-8或ASCII文件,這會打破嗎? – 2009-08-06 14:21:29

+0

@Andrew Keeton:如果你不把編碼從「utf-16」改爲「utf-8」或「ascii」(或「cp1252」),當然會中斷。請參閱'http:// www.amk.ca/python/howto/unicode'和'http:// www.joelonsoftware.com/articles/Unicode.html' – 2009-08-06 15:54:53

0

試過嗎?當保存一個非ASCII字符的解析腳本時,我讓解釋器在文件的前面建議一個替代編碼。

Non-ASCII found, yet no encoding declared. Add a line like: 
# -*- coding: cp1252 -*- 

添加,作爲腳本的第一行解決了我的問題。不知道這是不是導致你的錯誤。

+0

這肯定不會導致他的錯誤。你的是一個編譯時問題 - 在cp1252中編碼的源文件沒有這麼聲明。他是由於試圖讀取utf16編碼的文件而導致的運行時問題,就像它是ascii一樣。 – 2009-08-06 00:05:41