2010-06-25 133 views
2

我在這裏遇到了一些問題。 我正在將二進制轉換爲ascii,以便壓縮數據。 所有似乎工作正常,但是當我將'11011011'轉換爲ascii並嘗試將其寫入文件時,我不斷收到錯誤Python寫入文件

UnicodeEncodeError:'charmap'編解碼器無法在位置0編碼字符'\ xdb' :字符映射到

這裏是我的代碼:

byte = "" 
    handleR = open(self.getInput()) 
    handleW = open(self.getOutput(), 'w') 
    file = handleR.readlines() 
    for line in file: 
     for a in range(0, len(line)): 
      chunk = result[ord(line[a])] 
      for b in chunk: 
       if (len(byte) < 8): 
        byte+=str(chunk[b]) 
       else: 
        char = chr(eval('0b'+byte)) 
        print(byte, char) 
        handleW.write(char) 
        byte = "" 
    handleR.close() 
    handleW.close() 

任何幫助表示讚賞,

謝謝

+0

當我讀「二進制到ASCII」時,我以爲你是以相反的方式,即''\ xdb''到''11011011'' :-) – 2010-06-25 05:28:08

回答

2

我想你想要:

handleR = open(self.getInput(), 'rb') 
handleW = open(self.getOutput(), 'wb') 

這將確保你正在讀寫字節流。此外,您可以解析二進制字符串而無需評估:

char = chr(int(byte, 2)) 

當然,使用位操作會更快。您可以使用<<(左移)和|(按位或)來代替附加到字符串。

編輯:對於實際的寫作,你可以使用:

handleW.write(bytes([char])) 

這將創建並從由一個單一的數字列表寫入bytes

編輯2:更正,應該是:

handleW.write(bytes([int(byte, 2)])) 

沒有必要使用chr

+0

謝謝你的回答,但是我怎麼能直接用wb模式)寫入(str)「11011011」到文件中? 不,我得到「TypeError:無法將str寫入二進制流」 – Mikk 2010-06-25 05:33:13

+0

非常感謝。 最後的工作和版本是handleW.write(字節(字符串(int(byte,2)),「utf-8」)) – Mikk 2010-06-25 06:06:19

+1

@Mikk,我以前的回答部分是錯誤的。它可以是'handleW.write(bytes([int(byte,2)]))'。 – 2010-06-25 06:25:54