这是一个错误吗?它演示了当您使用libtiff从打开的tiff文件句柄中提取图像时会发生什么.它在python 2.x中工作,在python 3.2.3中不起作用
import os
# any file will work here, since it's not actually loading the tiff
# assuming it's big enough for the seek
filename = "/home/kostrom/git/wiredfool-pillow/Tests/images/multipage.tiff"
def test():
fp1 = open(filename, "rb")
buf1 = fp1.read(8)
fp1.seek(28)
fp1.read(2)
for x in range(16):
fp1.read(12)
fp1.read(4)
fd = os.dup(fp1.fileno())
os.lseek(fd, 28, os.SEEK_SET)
os.close(fd)
# this magically fixes it: fp1.tell()
fp1.seek(284)
expect_284 = fp1.tell()
print ("expected 284, actual %d" % expect_284)
test()
Run Code Online (Sandbox Code Playgroud)
我觉得错误的输出是:预期284,实际-504
取消注释fp1.tell()会产生一些......副作用...这会稳定py3句柄,我不知道为什么.如果有人可以测试其他版本的python3,我也很感激.
不,这不是一个错误.Python 3 io库为您提供open()调用的文件对象,为您提供缓冲的文件对象.对于二进制文件,您将获得一个(子类)io.BufferedIOBase.
尽管您也可以在那里使用io库,但Python 2文件对象更加原始.
通过在操作系统级别进行搜索,您正在绕过缓冲区并且正在破坏内部状态.一般来说,正如医生对患者抱怨捏他的皮肤疼痛:不要这样做.
如果你迫切需要这样做,至少要通过属性使用底层的原始文件对象(类的子io.RawIOBase类):io.BufferedIO.raw
fp1 = open(filename, "rb").raw
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |