20

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)

何が起こっていて、どうすれば修正できますか? BufferedReader はストリームをバッファリングするためのものだと思いました。もしそうなら、なぜopen()関数はそれと互換性のあるものを返さないのですか?

4

3 に答える 3

25

ステートメントを見ると、printPython 2 を使用しています。そのバージョンでは、 aはコンストラクターfileへの有効な引数ではありません。BufferedReader

Python 2.x では、これは組み込みオブジェクトの代替として提案されていfileますが、Python 3.x ではファイルとストリームにアクセスするためのデフォルト インターフェイスです。( 1 )

io.open代わりに次を使用する必要があります。

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

これを行う場合、デフォルトで返されるBufferedReaderものとまったく同じであるため、明示的に a でラップする必要はありません。io.open

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

詳細については、そのドキュメントを参照してください。bufferingバッファリングを制御する引数があります。

Python 3 ではopenio.open2 つの I/O ライブラリが 1 つにマージされました。io主に上位互換性のために Python 2.6 に追加されたようです。

于 2012-04-17T21:34:19.037 に答える
6

openにbuffering引数を渡すことにより、バッファリングの量をバイト単位で設定できます。

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'>

デフォルトでは、-linebufferedにバッファリングされていることに注意してください1

于 2012-04-17T21:17:58.210 に答える