2012-04-25 76 views
3

我試圖讀取使用Python3.2中,某些文件可能包含Unicode有的沒有的一些文件。閱讀Unicode文件 - Python3.2

當我嘗試:

file = open(item_path + item, encoding="utf-8") 
for line in file: 
    print (repr(line)) 

我得到的錯誤:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 13-16: ordinal not in range(128) 

我下面這裏的文檔:http://docs.python.org/release/3.0.1/howto/unicode.html

爲什麼Python中試圖編碼在任何以ASCII點這個代碼?

+2

要清楚:當你在這裏寫Unicode時,你的意思是UTF-8?另外,聽起來好像所有文件都是UTF-8,但有些可能只包含也是ASCII的子集。 – 2012-04-25 09:30:55

+0

這是正確的。 – 2012-04-25 09:32:37

+0

http://stackoverflow.com/a/983752/680372 – pylover 2015-09-13 17:32:45

回答

2

什麼是你的輸出編碼?如果您刪除了對print()的呼叫,它是否開始工作?

我懷疑你有一個非UTF-8語言環境,所以Python試圖編碼repr(line)作爲ASCII打印它的一部分。

要解決此問題,您必須編碼字符串,並打印字節數組,或者設置默認編碼的東西,可以處理你的字符串(UTF-8是顯而易見的選擇)。

+0

是的,你是對的。它只是打印導致問題,當我傳遞給其他東西(例如,QListView)它們顯示正常。 – 2012-04-25 09:44:28

3

的問題是,在Python repr(line) 3個收益也Unicode字符串。它不會將上述128個字符轉換爲ASCII轉義序列。

使用ascii(line)代替,如果你想看到的轉義序列。

實際上,repr(line)預期返回,如果放置在一個源代碼會產生具有相同值的對象的字符串。這樣,Python 3的行爲就好了,因爲在源文件中不需要ASCII轉義序列來表示具有多於ASCII字符的字符串。今天使用UTF-8或其他一些Unicode編碼是很自然的。事實是,Python 2爲這些角色生成了轉義序列。