2016-03-11 54 views
0

我覺得張貼這樣一個絕對的白癡...Python的Unicode字節解碼從文件

所以,我正在做一個文件crypter讀取一個文本文件,它輸出到一個加密的文件,然後允許您將該文件重新轉換爲純文本。我已經寫下了這個文件,但是讀它是一個問題。

從加密:

newf.write(bytes(result[0], "utf-8")) 
newf.write(bytes('{[:|:;:|:]}')) 
newf.write(bytes(result[1], "utf-8")) 
newf.close() 

而且還解密:

name = fudder.askopenfilename(defaultextension =("Text Files","*.txt"),title = "Choose a file to decrypt.") 
    with open(name,'rb') as Usefile: 
     filecont = bytes(Usefile.read(),'utf-8') 

它帶來了這個錯誤:

File "C:\STUFF\FILE.py", line 93, in <lambda> 
    self.fileO = Button(text = 'Decrypt File', command = lambda: cryptFile()) 
    File "C:\STUFF\FILE.py", line 60, in cryptFile 
    filecont = Usefile.read() 
    File "C:\Program Files (x86)\Python35-32\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 68: character maps to <undefined> 
+0

看看'codecs.open'(https://docs.python.org/2/library/codecs.html?highlight=open#codecs.open)。它應該允許您在打開文件時指定unicode編碼,然後透明地讀取其內容。 –

+0

這是Python 2還是3?你得到的錯誤不是來自你顯示的代碼? 'filecont = Usefile.read()。decode('utf-8')'工作嗎? – tdelaney

+0

你應該能夠爲這個問題編寫一個可運行的例子。如果我們要測試一個解決方案,這意味着我們必須編寫一個... – tdelaney

回答

0

回溯表明您真正代碼,在該線路上cryptFile功能發生錯誤:

filecont = UseFile.read() 

UnicodeDecodeError表示UseFile是可能已經在文本模式下打開,而無需指定的編碼一個類文件的對象。這意味着它將嘗試使用cp1252的默認編碼(在Windows上)來解碼實際編碼爲UTF-8的文件。很明顯,當編解碼器遇到任何未映射的字節時(例如0x81),這會失敗。

的解決方案是在打開文件時,以指定的正確的編碼:

with open(name, 'rt', encoding='utf-8') as Usefile: 
     filecont = UseFile.read() 

這將導致filecont是Unicode字符串對象。