繁体   English   中英

io.BufferedReader peek函数返回缓冲区中的所有文本

[英]io.BufferedReader peek function returning all the text in the buffer

我在Windows 8上使用Python 3.4.1。

我想读一个带缓冲接口的文件,它允许我查看前面的一定数量的字节以及读取字节。 io.BufferedReader似乎是正确的选择。

不幸的是, io.BufferReader.peek似乎没用,因为它似乎只返回缓冲区中存储的所有字节,而不是请求的数字。 事实上,这个函数的文档是允许的(强调我的):

peek([size])从流中返回字节而不提升位置。 最多只对原始流进行一次读取以满足调用。 返回的字节数可能少于或多于请求的数量。

为了演示我认为无用的行为,我有以下测试文件名为Test1.txt

first line
second line
third line

我在IDLE中创建了这样的io.BufferedReader对象:

>>> stream = io.BufferedReader(io.FileIO('Test1.txt'))

然后要求两个字节,

>>> stream.peek(2)
b'first line\r\nsecond line\r\nthird line'

嗯? 这只是默认缓冲区大小中的所有文本(在我的系统上是8192字节)。 如果我改变了这个默认值,我可以确认peek()只是返回缓冲区的内容,

>>> stream2 = io.BufferedReader(io.FileIO('Test1.txt'), buffer_size=2)
>>> stream2.peek(17)
b'fi'
>>> stream2.peek(17)
b'fi'
>>> stream2.read(2)
b'fi'
>>> stream2.peek(17)
b'rs'

需要说明的是,以下是我希望看到的输出:

>>> stream = io.BufferedReader(io.FileIO('Test1.txt'))
>>> stream.peek(2)
b'fi'
>>> stream.read(1)
b'f'
>>> stream.peek(2)
b'ir'

也就是说,典型的缓冲流。

我在构建这个BufferedReader时做错了什么? 如何观察我期望在Python 3.4.1中看到的行为?

.peek()确实实现为返回当前缓冲区; 如果你将它与.read()调用结合起来,你会发现在缓冲区再次填满之前会返回越来越少的缓冲区。

对于.peek()大多数目的来说,这不仅仅是好的。 如果缓冲区为空,则字节数允许您限制从底层I / O源预期的数据量,如果该源阻塞读取,则这又很重要。

只需切片返回的值:

stream.peek(num)[:num]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM