2015-10-17 60 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