Python: 为什么peek(1)返回8K字节而不是1字节?

10 投票
1 回答
6128 浏览
提问于 2025-04-18 15:35

我在用Python 3,发现缓冲文件输入输出中的peek()方法似乎没有按文档说明的那样工作。比如,下面的代码就说明了这个问题——它打印出8192,这是通过f.peek(1)返回的字节字符串的长度:

jpg_file = 'DRM_1851.JPG'
with open(jpg_file, 'rb') as f:
    next_byte = f.peek(1)
    print(len(next_byte))

我有时候想在不移动文件指针的情况下查看下一个字节,但因为上面的代码不管用,所以我在那些地方改用这个方法:

next_byte = f.read(1) # read a byte
f.seek(-1,1) # move the file pointer back one byte

这样做是有效的,但感觉有点绕。难道我对peek()的用法有什么误解吗?

1 个回答

12

来自Python文档的内容:

peek([size])

从流中返回字节,但不会移动读取位置。为了满足这个调用,最多只会对原始流进行一次读取。返回的字节数可能会少于或多于请求的数量。

强调是我的。

因为在peek中,文件指针并不会移动,所以即使peek读取的字节数超过你想要的,也没关系。你只需要在调用peek之后取一个子串就可以了:next_byte = f.peek(1)[:1]

撰写回答