Using io.BufferedReader on a stream obtained with open()?

buffered, io, python, python-2.7

Solution

By the looks of your `print` statement, you're using Python 2. On that version, a `file` is not a valid argument to the `BufferedReader` constructor:

Under Python 2.x, this is proposed as an alternative to the built-in `file` object, but in Python 3.x it is the default interface to access files and streams. (1)

You should use `io.open` instead:

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

If you do this, there's no need to explicitly wrap it in a `BufferedReader` since that's exactly what `io.open` returns by default:

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

See its docs for details; there's a `buffering` argument that controls the buffering.

In Python 3, `open` is `io.open` so the two I/O libraries have been merged back into one. It seems that `io` was added to Python 2.6 mostly for forward compatibility.

Problem

I want to use a buffered stream because I want to use a `peek()` method to peek ahead but use my stream with another method that expects a file-like object. (I'd use `seek()` but may have to handle piped-in I/O that doesn't support random access.) But this test case fails: AttributeError: 'file' object has no attribute '_checkReadable' ``` import sys import io srcfile = sys.argv[1] with open(srcfile, 'rb') as f: fbuf = io.BufferedReader(f) print fbuf.read(20) ``` What's going on and how do I fix it? I thought BufferedReader was intended to buffer a stream. If so, why does the `open()` function not return something that's compatible with it?

Original source

Related problems