2015-10-17 66 views
0

有什麼簡單的方法可以讓我將二進制文件的內容作爲二進制字符串讀取,將其轉換爲普通(utf-8)字符串,對其進行一些操作,將其轉回成二進制字符串,並將其寫入二進制文件?我試圖做的簡單的東西:通過python 3字節文件轉換

a_file = open('image1.png', 'rb') 
text = b'' 
for a_line in a_file: 
    text += a_line 
a_file.close() 
text2 = text.decode('utf-8') 
text3 = text2.encode() 
a_file = open('image2.png', 'wb') 
a_file.write(text3) 
a_file.close() 

,但我得到「的Unicode不能在位置解碼字節......」

我在做什麼可怕的錯誤?

+1

爲什麼你認爲一個PNG文件將包含文本? –

+0

不知道你想完成什麼,但[這個答案](http://stackoverflow.com/a/22621777/355230)對另一個問題可能會有所幫助。 – martineau

回答

0

utf8格式具有足夠的結構,即隨機排列的字節不是有效的UTF-8。最好的辦法是簡單地使用從文件中讀取的字節(可以用text = a_file.read()一步提取)。二進制字符串(類型bytes)具有所有您想要的字符串方法,即使是面向文本的字符串,如isupper()swapcase()。然後是bytearray,這是bytes類型的可變對象。

如果你真的把你的字節到一個str對象某種原因,使用純8位編碼像Latin1。你會得到一個unicode字符串,這是你真正的追求。 (UTF-8只是Unicode的一種編碼 - 一個非常不同的東西。)

+1

注意,如果你在工作編碼上(例如'latin-1'),你不需要在Python 3中自己處理編碼/解碼。只需要改變'open('image1.png','rb' )'打開'('image1.png','r',encoding ='latin-1')',並輸出'open('image2.png','w',encoding ='latin-1 ''),你可以讀寫,而不用麻煩手動編碼/解碼;它會在讀取時被解碼爲'str',並且會在編寫時爲您編碼'str'。 – ShadowRanger

+0

好點;儘管以二進制模式打開文件會使代碼更加透明......我不確定OP應該轉換爲「str」。 – alexis