Jas*_*n S 14 python io buffered python-2.7
我想使用缓冲流,因为我想使用一个peek()方法来提前查看,但使用我的流与另一个需要类文件对象的方法.(我使用seek()但可能必须处理不支持随机访问的管道输入I/O.)
但是这个测试用例失败了:
AttributeError:'file'对象没有属性'_checkReadable'
import sys
import io
srcfile = sys.argv[1]
with open(srcfile, 'rb') as f:
fbuf = io.BufferedReader(f)
print fbuf.read(20)
Run Code Online (Sandbox Code Playgroud)
发生了什么,我该如何解决?我以为BufferedReader旨在缓冲流.如果是这样,为什么open()函数不会返回与它兼容的东西?
Fre*_*Foo 20
根据您的print语句的外观,您使用的是Python 2.在该版本中,a file不是BufferedReader构造函数的有效参数:
在Python 2.x下,这被提议作为内置
file对象的替代,但在Python 3.x中,它是访问文件和流的默认接口.(1)
您应该使用io.open:
>>> f = io.open(".bashrc", "rb")
Run Code Online (Sandbox Code Playgroud)
如果你这样做,就没有必要明确地将它包装成一个,BufferedReader因为这正是io.open默认返回的:
>>> type(f)
<type '_io.BufferedReader'>
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅其文档 ; 有一个buffering控制缓冲的参数.
在Python 3中,open is io.open两个I/O库已合并为一个.它似乎io被添加到Python 2.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))
Run Code Online (Sandbox Code Playgroud)
这是一个BufferedReader:
>>> with open("test.txt", 'rb', buffering=30) as f:
... type(f)
<class '_io.BufferedReader'>
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下,它被缓冲到1- 行缓冲。
| 归档时间: |
|
| 查看次数: |
38309 次 |
| 最近记录: |