2013-06-26 58 views
0

我正在編寫一個程序來迭代我的Robocopy-Log(> 25 MB)。目前還沒有準備好,因爲我遇到了問題。Python3:爲什麼我得到一個UnicodeDecodeError或這是一個內存問題?

的問題是,迭代〜後1700線我的日誌 - >我得到一個 「UnicodeError」:

Traceback (most recent call last): 
    File "C:/Users/xxxxxx.xxxxxx/SkyDrive/#Python/del_robo2.py", line 6, in <module> 
    for line in data: 
    File "C:\Python33\lib\encodings\cp1252.py", line 23, in decode 
    return codecs.charmap_decode(input,self.errors,decoding_table)[0] 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 7869: character maps to <undefined> 

程序如下所示:

x="Error" 
y=1 
arry = [] 
data = open("Ausstellungen.txt",mode="r") 
for line in data: 
    arry = line.split("\t") 
    print(y) 
    y=y+1 
    if x in arry: 
     print("found") 
     print(line) 
data.close() 

如果我減少TXT文件到1000行然後該程序工作。 如果我刪除行1500到3000並再次運行,我再次得到1700行左右的Unicode錯誤。

所以,我犯了一個錯誤,或者這是一些Python的內存限制問題?

+0

這是一個編碼問題,而不是內存問題。 – pynovice

+0

你應該將'encoding'參數傳遞給'open'(如果你使用python3,在python2中使用'codecs.open')。 – Bakuriu

回答

0

鑑於你的數據&片段,如果這是一個內存問題,我會感到驚訝。它更可能是編碼:Python使用系統的默認編碼來讀取文件,即「cp1252」(默認的MS Windows編碼),但文件包含無法在該編碼中解碼的字節序列/字節。一種文件的實際編碼候選人可能是「拉丁-1」,它可以使Python 3使用說

open("Ausstellungen.txt",mode="r", encoding="latin-1") 

,可能爲類似的問題是Python 3 chokes on CP-1252/ANSI reading。關於整個事情的一個很好的說法是:http://nedbatchelder.com/text/unipain.html

+0

THX很多,將編碼設置爲拉丁文在這種情況下是正確的。我的第一個Python日誌檢查程序慢慢地獲得物質:)。 – polYtoX

0

Python將所有文件數據解碼爲Unicode值。您沒有指定要使用的編碼,因此Python使用系統的默認值cp1252 Windows Latin codepage

但是,這是您的文件數據編碼錯誤。你需要指定一個明確的編解碼器來使用:

data = open("Ausstellungen.txt",mode="r", encoding='UTF8') 

什麼編碼使用正好,不幸的是你需要弄清楚自己的東西。我使用UTF-8作爲編解碼器的示例。請注意,some versions of RoboCopy have problems producing valid output

如果你還不知道Unicode是什麼,或者想了解編碼,請參閱:

您看到文件不同部分出現錯誤的原因是,您的數據包含多個cp1252編碼無法處理的代碼點。

+0

THX爲豐富的信息。選擇UTF8對我來說不起作用,但你明確寫道,可能日誌格式不正確。 – polYtoX

+0

@polYtoX:如果使用了'/ unilog',那麼輸出將會(應該)以UTF16格式。 –

相關問題