2011-05-06 74 views
1

我得到錯誤:"UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 7338: ordinal not in range(128)"一旦我嘗試運行該程序後凍結我的腳本與cx_freeze。如果我通常運行Python 3腳本,它運行良好,但只有在我凍結它並嘗試運行可執行文件後,纔會給我這個錯誤。我會發布我的代碼,但我不知道到底發佈了哪些部分,所以如果有任何特定的部分可以幫助我知道,我會發布它們,否則就好像我之前曾經遇到過這個問題並解決了但是它已經有一段時間了,我不記得問題到底是什麼,或者我是如何修復它的,所以任何幫助或指引讓我朝着正確的方向前進將會有很大的幫助。提前致謝。UnicodeDecodeError only with cx_freeze

回答

1

告訴我們到底該在什麼平臺上的Python版本。

顯示錯誤發生時獲得的完整回溯。自己看看吧。你的代碼的最後一行是什麼?你認爲正在解碼的bytes字符串是什麼?爲什麼使用ascii編解碼器?

請注意,使用默認編解碼器(例如ascii)自動將bytes轉換爲str不是由Python 3.x完成的。所以無論你是明確的還是cx_freeze。

更新後進一步信息的意見。

Excel不會以ASCII格式保存csv文件。它將它們保存在MS所稱的「ANSI代碼頁」中,該代碼頁因語言環境而異。如果你不知道你的是什麼,那大概是cp1252。要檢查,做到這一點:

>>> import locale; print(locale.getpreferredencoding()) 
cp1252 

如果Excel沒有在ASCII保存文件,你得罪'\xa0'字節將被替換爲「?」你不會得到一個UnicodeDecodeError。

保存你的文件在UTF-8將需要你打開你的文件與encoding='utf8'並會有同樣的問題(除了你會發牢騷約0xc2而不是0xa0)。

您不需要在網絡上發佈所有四個csv文件。只要運行這個小腳本(未經測試):

import sys 
for filename in sys.argv[1:]: 
    for lino, line in enumerate(open(filename), 1): 
     if '\xa0' in line: 
      print(ascii(filename), lino, ascii(line)) 

'\xa0'NO-BREAK SPACE又名  ...你可能要編輯您的文件,這些改變爲普通空間。

可能您需要在cx_freeze郵件列表上詢問爲何發生此錯誤的答案。他們會想知道完整的追溯。練習一下 - 在這裏展示。

順便說一下,「偏移7338」是相當大的 - 你期望csv文件中長的行嗎?也許事情是閱讀完所有的文件...

+0

我在Windows上使用python v3.1,在機器人x86和64上試過。我會告訴你完整的回溯。我的代碼在堆棧上的最後一次調用是for循環,用於從csv文件中獲取我的數據:'用於DataReader中的行:'。我不知道爲什麼ascii編解碼器被使用,我沒有明確地使用它,我已經嘗試打開記事本中的2個問題文件,並將編碼更改爲UTF-8並重新保存,因爲可能excel保存爲ascii編碼,仍然沒有幫助。所以我想這留下cx_freeze使用ascii這是有道理的,如果問題只出現在我凍結腳本後。那麼我該如何解決這個問題? – 2011-05-06 22:04:20

+0

@Brock S .:編輯你的問題,而不是在評論中添加新的信息。 *顯示完整的追蹤*。顯示你如何打開輸入文件。 – 2011-05-06 22:17:16

+0

這工作得很好!一個文件中有兩行在其中一個單元格的末尾有一行,另一個文件中有一行使用了空格而不是空格。我所需要做的就是擺脫這些角色,並用一個固定的空間來替換這些角色。這讓我很困惑,爲什麼我現在剛剛得到這個錯誤。我之前使用這些文件的凍結腳本與我現在使用的方式相同。我想我會問你的cx_freeze郵件列表,你可能會看到爲什麼這個錯誤只出現在這個時候。謝謝您的幫助。 – 2011-05-09 14:17:18

0

使用該行的str.decode()函數。也可以指定編碼,如myString.decode('cp1252')

看也:http://docs.python.org/release/3.0.1/howto/unicode.html#unicode-howto

+1

失去了'.'在' 'utf8.'' – 2011-05-06 21:27:45

+0

一個普通的'\ xa0'本身ISN' t有效的UTF-8,它很可能是ISO 8859-1或Windows-1252。 – 2011-05-06 23:35:56

+0

@Adam Rosenfield:他在Windows上閱讀Excel的結果「另存爲CSV」。機會是ISO 8859-1是<= 0 :) – 2011-05-07 00:08:41

1

該錯誤本身就說明你有一個python字符串中的字符不正常的ASCII字符:

>>> b'abc\xa0'.decode('ascii') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 3: ordinal not in range(128) 

我當然不知道爲什麼會只有當腳本被凍結時纔會發生。您可以將整個腳本包裝在try/except中,然後手動打印出所有或部分字符串。

編輯:這裏是如何可能看起來

try: 
    # ... your script here 
except UnicodeDecodeError as e: 
    print("Exception happened in string '...%s...'"%(e.object[e.start-50:e.start+51],)) 
    raise 
+0

確定問題的更新信息稍微多一點。 DataReader是一個csv閱讀器對象,行'DataReader:'中出現問題。所以爲了增加奇怪的效果,這個錯誤只發生在我凍結後,它也只發生在我的程序開始時從我讀取數據的4個文件中的第2個。我將每個for循環包裝在try/except中,並且在發生錯誤時它在一開始發生,所以它不會從csv文件中提取任何數據。有任何想法嗎?如果你能告訴我第一個2和最後2個之間出現錯誤的區別,我可以以某種方式發佈所有4個csv文件。 – 2011-05-06 21:50:19

+0

你會想打印出一些弄亂事情的字符串部分,以便找出原因(請參閱上面的答案中的最新編輯)。如果不清楚發生了什麼以及爲什麼,試着在處理非凍結版本中相同字符串的相同部分時檢查腳本,並檢查該字符串本身是否具有不同的字符,或者發生了其他事情。 – 2011-05-06 23:48:50

1

修復由一套默認編碼:

reload(sys) 
sys.setdefaultencoding("utf-8") 
+0

來自'sys.setdefaultencoding'的Python文檔:「這個函數只用於站點模塊的實現,並且在需要的時候由sitecustomize使用。」 – erickrf 2013-08-15 04:23:53