2013-05-21 133 views
0

這是我在這裏的第一篇文章,所以我不希望這篇文章沒有出現在錯誤的主題或某些內容中,但是我遇到了Python應用程序的一個不常見的問題我在寫。閱讀文件時出現「Unicode error」

基本上,我試圖讓它做的是從文本文件中讀取並將其部分插入到Tkinter文本小部件中。該文本文件包含通常的「\ n」換行符,但是當我運行代碼時,我得到這個奇怪的錯誤,我沒有能夠做出解決方法:

(順便說一句,抱歉,糟糕的設置 - 最多在這裏...不知道如何來解決這個新的代碼進入系統,它似乎「由它自己的規則行事」,並有自己的語法,所以我只是複製/粘貼它下面:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python33\lib\idlelib\run.py", line 107, in main 
    seq, request = rpc.request_queue.get(block=True, timeout=0.05) 
    File "C:\Python33\lib\queue.py", line 175, in get 
    raise Empty 
queue.Empty 

在處理上述異常期間,發生了另一個異常:

Traceback (most recent call last): 
    File "C:\Python33\lib\tkinter\__init__.py", line 1442, in __call__ 
    return self.func(*args) 
    File "C:\Users\Owner\Desktop\Python projects\The Ultimate Joke Book.py", line 89, in search 
    results.create() 
    File "C:\Users\Owner\Desktop\Python projects\The Ultimate Joke Book.py", line 31, in create 
    joke = linecache.getline('Jokes/jokelist.txt',x) 
    File "C:\Python33\lib\linecache.py", line 15, in getline 
    lines = getlines(filename, module_globals) 
    File "C:\Python33\lib\linecache.py", line 41, in getlines 
    return updatecache(filename, module_globals) 
    File "C:\Python33\lib\linecache.py", line 127, in updatecache 
    lines = fp.readlines() 
    File "C:\Python33\lib\codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 627: invalid start byte 

所以導致問題的函數 - 只是在for循環中使用的「linecache.getline」 - 在文本中沒有「\」時完美工作,但無論出於何種原因,它都不喜歡「\」並啓​​動「spittin」錯誤。 :/

所以今晚我在「docs」(http://docs.python.org/3/howto/unicode.html)上花了近一個小時,閱讀了unicode的所有歷史和基本概念,但它載入了假定的知識,雖然它對信息有幫助,在概念層面上,似乎在實用信息和潛在解決方案方面做得並不多。

我可以拿出來解決這個令人討厭的小錯誤的唯一解決方案是使用「/ n」來代替並以編程方式將字符串拆分爲一個數組(或稱爲「列表」,因爲它們似乎用Python調用),然後使用一個循環將其分解爲多於一行......但這聽起來像是很多不必要的步驟,特別是如果已經存在常見的解決方法。所以,如果能解決這個特別神祕的問題,我將不勝感激。

謝謝。

+2

除非你解釋你的程序中的哪些代碼行在這些堆棧跟蹤中被提及,否則你不可能得到一個好的答案。 –

+7

'\ xbf'是一個顛倒的問號(UTF-8)。你確定這是問題的'\ n'嗎?文件還有什麼?什麼是文件的編碼?你能提供一個獨立的例子來證明問題嗎? – BrenBarn

+0

@BrenBarn:不,它不是。不過,這是一個拉丁語-1的顛倒問號。 ;-)它是無效的UTF-8,這就是他得到錯誤的原因。 –

回答

0

UTF-8解碼器的數據不是UTF-8。這就是你得到錯誤的原因。你需要給我們失敗的代碼和一些數據例子來解釋到底發生了什麼。

拉丁語-1和CP-1252中的字符是「¿」。也許這是在Windows機器上寫的西班牙語文本?在這種情況下,請在打開文件時指定編碼。

+0

嗯,我會說西班牙語並運行Windows,但文本全部是英文的。 :) – user2403876

+0

對不起,還在學習這個評論系統的怪癖。讓我爲你解決我的問題。 :)好的,回答這些問題(由於限制,他們必須以2個答覆的形式出現):儘管我會說西班牙語並使用Windows,但文本是英文的。就字符串而言,我已確認「\」是問題,因爲它在我刪除它時正常工作。 – user2403876

+0

導致錯誤的代碼就像我說的那樣是一個簡單的「linecache.getline」。我沒有對文本文件進行任何編碼,也沒有嘗試告訴Python做任何編碼......它幾乎聽起來像是Python中的某些東西與文本文件不兼容? (我的意思是內部的東西仍然在我的頭上)。我是否需要將文件另存爲另一種格式,或者以某種方式將文本文件的編碼更改爲不同的編碼器?或者它是我可以在Python中做的東西(改變它如何讀取文本,或者做一個「替換」來找到/ n並用chr(_)代替?無論如何再次感謝您的幫助:) – user2403876