#!/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中将二进制文件读入字符串类型?
答案 0 :(得分:0)
在Python 2.x中,二进制模式(例如'rb'
)仅影响Python解释行尾字符的方式:
在Windows上,附加到该模式的
'b'
以二进制模式打开文件,因此 还有'rb'
,'wb'
和'r+b'
等模式。 Windows上的Python 区分文本和二进制文件;行尾 文本文件中的字符会在数据时自动更改 被读或写。这种对文件数据的幕后修改 适用于ASCII文本文件,但它会破坏这样的二进制数据 在JPEG
或EXE
个文件中。阅读时要非常小心使用二进制模式 并写这样的文件。在Unix上,附加'b'
并没有什么坏处 模式,所以你可以平台独立使用它为所有二进制文件 文件。
但是在Python 3.x中,二进制模式也会更改结果数据的类型:
通常,文件以文本模式打开,这意味着,您阅读和 从文件中写入字符串,以特定的方式编码 编码。如果未指定编码,则默认为platform 依赖(见
open()
)。附加到该模式的'b'
将打开该文件 二进制模式:现在以字节的形式读取和写入数据 对象。此模式应该用于所有不包含的文件 文本。
由于读取结果是一个bytes对象,因此索引它会产生一个整数,而不是Python 2中的单字符字符串。将该整数传递给ord()
函数会引发{{3}中提到的错误}。
解决方案只是省略Python 3中的ord()
调用,因为从索引bytes对象获得的整数与你在调用ord()
时得到的整数相同。字符串等价物。