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

10

我正在使用Python 3,但是缓冲文件I/O的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
请参见https://dev59.com/v4Hba4cB1Zd3GeqPMRBR。 - Jason S
1个回答

11

来自Python文档:

peek([size])

在不改变流位置的情况下从流中返回字节。最多只有一次单个读取原始流以满足调用。返回的字节数可能少于或多于请求的字节数。

强调是我的。

由于在peek中文件指针没有移动,所以即使peek读取超过您想要的量也并不重要。只需在进行peek操作后截取子串即可:next_byte = f.peek(1)[:1]


1
如果没有返回字节,那么应该是 f.peek(1)[:1],对吗? - Jason S
非常感谢!我现在明白了。我必须承认,我曾经读过Python文档中的那一行不止一次,但我从未完全领会那三个字“或者更多”。 - Doug Mahugh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接