相关疑难解决方法(0)

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

我在Windows 8上使用Python 3.4.1.

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

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

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

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

first line
second line
third line
Run Code Online (Sandbox Code Playgroud)

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

>>> stream = io.BufferedReader(io.FileIO('Test1.txt'))
Run Code Online (Sandbox Code Playgroud)

然后要求两个字节,

>>> stream.peek(2)
b'first line\r\nsecond line\r\nthird line'
Run Code Online (Sandbox Code Playgroud)

嗯?这只是默认缓冲区大小中的所有文本(在我的系统上是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'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

python

5
推荐指数
1
解决办法
2627
查看次数

标签 统计

python ×1