![](/img/trans.png)
[英]Python - How to use custom buffer_size in io.BufferedReader?
[英]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.