在python2中没问题,但在python3中没有用

时间:2016-05-20 20:05:45

标签: python-2.7 python-3.4 binaryfiles

#!/usr/bin/env python3

f = open('dv.bmp', mode='rb')
slika = f.read()
f.closed

pic   = slika[:28]
slika = slika[54:] 
# dimenzije originalnog bitmapa
pic_w = ord(pic[18]) + ord(pic[19])*256
pic_h = ord(pic[22]) + ord(pic[23])*256
print(pic_w, pic_h)

为什么这段代码在python3中不起作用(在python2中它工作正常)或者 如何在python3中将二进制文件读入字符串类型?

1 个答案:

答案 0 :(得分:0)

Python 2.x中,二进制模式(例如'rb')仅影响Python解释行尾字符的方式:

  

在Windows上,附加到该模式的'b'以二进制模式打开文件,因此   还有'rb''wb''r+b'等模式。 Windows上的Python   区分文本和二进制文件;行尾   文本文件中的字符会在数据时自动更改   被读或写。这种对文件数据的幕后修改   适用于ASCII文本文件,但它会破坏这样的二进制数据   在JPEGEXE个文件中。阅读时要非常小心使用二进制模式   并写这样的文件。在Unix上,附加'b'并没有什么坏处   模式,所以你可以平台独立使用它为所有二进制文件   文件。

但是在Python 3.x中,二进制模式也会更改结果数据的类型:

  

通常,文件以文本模式打开,这意味着,您阅读和   从文件中写入字符串,以特定的方式编码   编码。如果未指定编码,则默认为platform   依赖(见open())。附加到该模式的'b'将打开该文件   二进制模式:现在以字节的形式读取和写入数据   对象。此模式应该用于所有不包含的文件   文本。

由于读取结果是一个bytes对象,因此索引它会产生一个整数,而不是Python 2中的单字符字符串。将该整数传递给ord()函数会引发{{3}中提到的错误}。

解决方案只是省略Python 3中的ord()调用,因为从索引bytes对象获得的整数与你在调用ord()时得到的整数相同。字符串等价物。