2017-02-20 80 views
12

https://github.com/affinelayer/pix2pix-tensorflow/tree/master/tools錯誤的UnicodeDecodeError:上述網站編譯「process.py」無效時起始字節

出現錯誤:「UTF-8」編解碼器不能在位置0解碼字節0xFF。

python tools/process.py --input_dir data --   operation resize --outp 
ut_dir data2/resize 
data/0.jpg -> data2/resize/0.png 

回溯(最近通話最後一個):

File "tools/process.py", line 235, in <module> 
    main() 
File "tools/process.py", line 167, in main 
    src = load(src_path) 
File "tools/process.py", line 113, in load 
    contents = open(path).read() 
     File"/home/user/anaconda3/envs/tensorflow_2/lib/python3.5/codecs.py", line 321, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode  byte 0xff in position 0: invalid start byte 

什麼是錯誤的原因是什麼? Python的版本是3.5.2。

回答

22

Python試圖將一個字節數組(它假定爲utf-8編碼字符串的bytes)轉換爲Unicode字符串(str)。這個過程當然是根據utf-8規則進行的解碼。當它嘗試這個時,它會遇到一個字節序列,這在utf-8編碼的字符串中是不允許的(即位置0處的0xff)。

由於您沒有提供任何代碼,我們可以看看,我們只能猜測其餘的。

從堆棧跟蹤中,我們可以假設觸發操作是從文件讀取(contents = open(path).read())。我建議在這樣的方式重新編寫這樣的:

with open(path, 'rb') as f: 
    contents = f.read() 

這在open()指出該文件應作爲二進制待處理的模式說明b,所以contents仍將是一個bytes。沒有解碼嘗試會以這種方式發生。

+0

我得到的錯誤: – Unnikrishnan

+2

@Unnikrishnan好,然後用' 「ValueError異常模式字符串必須以 'R', 'W', 'A' 或 'U',而不是 'BR' 的一個開始」 rb'(我認爲順序並不重要,但似乎至少在某些系統/版本中)。我相應地改變了我的答案。 – Alfe

+3

位置0處的字節0xff也可能意味着文件以UTF-16編碼,那麼您可以使用open(path,encoding ='utf-16')作爲f:'而不是 –

1

檢查要讀取的文件的路徑。我的代碼一直給我錯誤,直到我將路徑名更改爲當前工作目錄。錯誤是:

newchars, decodedbytes = self.decode(data, self.errors) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte 
-1

如果可能,請在文本編輯器中打開該文件並嘗試將編碼更改爲UTF-8。否則以編程方式在OS級別執行。

7

有一個類似的問題,使用UTF-16解碼結束。我的代碼在下面。

with open(path_to_file,'rb') as f: 
    contents = f.read() 
contents = contents.rstrip("\n").decode("utf-16") 
contents = contents.split("\r\n") 

這將需要的文件內容導入,但它會在UTF格式返回的代碼。從那裏它將被解碼並通過線分離。

+0

在Python 3中,您可以簡化這通過使用編碼參數'與開放(路徑,encoding ='utf-16')作爲f' –

0

我有類似的問題。我嘗試在tensorflow/models/objective_detection中運行一個例子,並且遇到了同樣的消息。 嘗試將Python3更改爲Python2

4

我在遇到同樣的錯誤時遇到了此線程,在做了一些研究之後,我可以證實,這是在嘗試使用UTF解碼UTF-16文件時發生的錯誤-8。

With UTF-16 the first characther (2 bytes in UTF-16) is a Byte Order Mark (BOM),它被用作解碼提示並且不在解碼的字符串中出現作爲字符。這意味着第一個字節是FE或FF,第二個是另一個。

大量編輯後,我找到了真正的答案

+0

謝謝!這個答案非常有幫助。 – Dirigo

0

使用此解決方案將剝離出(忽略)的人物,沒有他們返回字符串。只有在你需要剝離它們而不是轉換它們時才使用它。

with open(path, encoding="utf8", errors='ignore') as f: 

使用errors='ignore' 你只是失去一些字符。但如果你不關心他們,因爲他們似乎是來自連接到我的套接字服務器的客戶端的錯誤格式和編程的額外字符。 然後,它是一個簡單的直接解決方案。 reference

相關問題