这是一个python 3文件错误?

Ken*_*rom 1 python python-3.2

这是一个错误吗?它演示了当您使用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,我也很感激.

Mar*_*ers 5

不,这不是一个错误.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)