20

我想使用缓冲流,因为我想使用一种peek()方法来窥视,但将我的流与另一种需要类似文件的对象的方法一起使用。(我会使用seek()但可能必须处理不支持随机访问的管道输入 I/O。)

但是这个测试用例失败了:

AttributeError:“文件”对象没有属性“_checkReadable”

import sys
import io

srcfile = sys.argv[1]
with open(srcfile, 'rb') as f:
    fbuf = io.BufferedReader(f)
    print fbuf.read(20)

发生了什么事,我该如何解决?我认为 BufferedReader 旨在缓冲流。如果是这样,为什么该open()函数不返回与其兼容的东西?

4

3 回答 3

25

print从您的陈述来看,您使用的是 Python 2。在该版本上, afile不是BufferedReader构造函数的有效参数:

在 Python 2.x 中,这是作为内置file对象的替代方案,但在 Python 3.x 中,它是访问文件和流的默认接口。()

您应该io.open改用:

>>> f = io.open(".bashrc", "rb")

如果这样做,则无需将其显式包装在 a 中,BufferedReader因为这正是io.open默认返回的内容:

>>> type(f)
<type '_io.BufferedReader'>

有关详细信息,请参阅其文档;有一个buffering控制缓冲的参数。

在 Python 3open中,io.open两个 I/O 库已合并为一个。似乎它io被添加到 Python 2.6 主要是为了向前兼容。

于 2012-04-17T21:34:19.037 回答
6

您可以通过将buffering参数传递给 open 来设置缓冲量(以字节为单位):

import sys

srcfile = sys.argv[1]
with open(srcfile, 'rb', buffering=30) as f:
    print(f.peek(30))
    print(f.read(20))

这是一个BufferedReader

>>> with open("test.txt", 'rb', buffering=30) as f:
...     type(f)
<class '_io.BufferedReader'>

请注意,默认情况下,它被缓冲到1- 行缓冲。

于 2012-04-17T21:17:58.210 回答
1

在Python2中,如果你必须使用file返回的对象open(或者例如一些你不能修改的模块例程提供的对象),你可以使用构造函数获取的文件描述符,然后将对象传递给fileno()构造函数。io.FileIOio.FileIOio.BufferedReader

因此,您的示例代码可以重写如下:

import sys
import io

srcfile = sys.argv[1]
with open(srcfile, 'rb') as f:
    fio  = io.FileIO(f.fileno())
    fbuf = io.BufferedReader(fio)
    print fbuf.read(20)
于 2016-06-29T16:23:37.967 回答