16.2。 io —ストリームを操作するためのコアツール
ソースコード: :source: `Lib / io.py`
16.2.1。 概要
io モジュールは、さまざまなタイプのI / Oを処理するためのPythonの主要な機能を提供します。 I / Oには、テキストI / O 、バイナリI / O 、生I / O の3つの主要なタイプがあります。 これらは一般的なカテゴリであり、それぞれにさまざまなバッキングストアを使用できます。 これらのカテゴリのいずれかに属する具体的なオブジェクトは、ファイルオブジェクトと呼ばれます。 他の一般的な用語は、ストリームおよびファイルのようなオブジェクトです。
カテゴリに関係なく、各具象ストリームオブジェクトには、読み取り専用、書き込み専用、または読み取り/書き込みのさまざまな機能もあります。 また、任意のランダムアクセス(任意の場所への順方向または逆方向のシーク)、またはシーケンシャルアクセスのみ(たとえば、ソケットまたはパイプの場合)を許可することもできます。
すべてのストリームは、提供するデータの種類に注意を払っています。 たとえば、バイナリストリームのwrite()
メソッドに str オブジェクトを指定すると、TypeError
が発生します。 したがって、 bytes オブジェクトをテキストストリームのwrite()
メソッドに渡します。
バージョン3.3で変更:[X13X] IOError が OSErrorのエイリアスになっているため、 IOError を発生させるために使用されていた操作で OSError が発生するようになりました。
16.2.1.1。 テキストI / O
テキストI / Oは、 str オブジェクトを予期して生成します。 これは、バッキングストアがネイティブにバイトで構成されている場合(ファイルの場合など)は常に、データのエンコードとデコードが透過的に行われ、プラットフォーム固有の改行文字のオプションの変換が行われることを意味します。
テキストストリームを作成する最も簡単な方法は、 open()を使用し、オプションでエンコーディングを指定することです。
f = open("myfile.txt", "r", encoding="utf-8")
インメモリテキストストリームは、 StringIO オブジェクトとしても利用できます。
f = io.StringIO("some initial text data")
テキストストリームAPIについては、 TextIOBase のドキュメントで詳しく説明されています。
16.2.1.2。 バイナリI / O
バイナリI / O(バッファI / O とも呼ばれます)は、バイトのようなオブジェクトを予期し、バイトオブジェクトを生成します。 エンコード、デコード、または改行の変換は実行されません。 このカテゴリのストリームは、あらゆる種類の非テキストデータに使用できます。また、テキストデータの処理を手動で制御する必要がある場合にも使用できます。
バイナリストリームを作成する最も簡単な方法は、モード文字列に open()と'b'
を使用することです。
f = open("myfile.jpg", "rb")
インメモリバイナリストリームは、 BytesIO オブジェクトとしても利用できます。
f = io.BytesIO(b"some initial binary data: \x00\x01")
バイナリストリームAPIについては、 BufferedIOBase のドキュメントで詳しく説明されています。
他のライブラリモジュールは、テキストまたはバイナリストリームを作成するための追加の方法を提供する場合があります。 たとえば、 socket.socket.makefile()を参照してください。
16.2.1.3。 生のI / O
生のI / O(バッファなしI / O とも呼ばれます)は、通常、バイナリストリームとテキストストリームの低レベルのビルディングブロックとして使用されます。 ユーザーコードから生のストリームを直接操作することはめったに役に立ちません。 それでも、バッファリングを無効にしてバイナリモードでファイルを開くと、生のストリームを作成できます。
f = open("myfile.jpg", "rb", buffering=0)
生のストリームAPIについては、 RawIOBase のドキュメントで詳しく説明されています。
16.2.2。 高レベルのモジュールインターフェース
- io.DEFAULT_BUFFER_SIZE
- モジュールのバッファリングされたI / Oクラスによって使用されるデフォルトのバッファサイズを含むint。 open()は、可能であればファイルのblksize( os.stat()で取得)を使用します。
- io.open(file, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
- これは、組み込みの open()関数のエイリアスです。
- exception io.BlockingIOError
- これは、組み込みの BlockingIOError 例外の互換性エイリアスです。
- exception io.UnsupportedOperation
- サポートされていない操作がストリームで呼び出されたときに発生する OSError および ValueError を継承する例外。
16.2.2.1。 インメモリストリーム
str または bytesのようなオブジェクトを読み取りと書き込みの両方のファイルとして使用することもできます。 文字列の場合、 StringIO は、テキストモードで開いたファイルのように使用できます。 BytesIO は、バイナリモードで開かれたファイルのように使用できます。 どちらも、ランダムアクセスによる完全な読み取り/書き込み機能を提供します。
16.2.3。 クラス階層
I / Oストリームの実装は、クラスの階層として編成されています。 最初に、ストリームのさまざまなカテゴリを指定するために使用される抽象基本クラス(ABC)、次に標準ストリーム実装を提供する具象クラス。
ノート
抽象基本クラスは、具象ストリームクラスの実装を支援するために、いくつかのメソッドのデフォルト実装も提供します。 たとえば、 BufferedIOBase は、
readinto()
および readline()の最適化されていない実装を提供します。
I / O階層の最上位には、抽象基本クラス IOBase があります。 ストリームへの基本的なインターフェイスを定義します。 ただし、ストリームへの読み取りと書き込みの間に分離はないことに注意してください。 実装は、特定の操作をサポートしていない場合、 UnsupportedOperation を発生させることができます。
RawIOBase ABCは IOBase を拡張します。 ストリームへのバイトの読み取りと書き込みを扱います。 FileIO サブクラス RawIOBase は、マシンのファイルシステム内のファイルへのインターフェイスを提供します。
BufferedIOBase ABCは、生のバイトストリーム( RawIOBase )でのバッファリングを処理します。 そのサブクラスである BufferedWriter 、 BufferedReader 、および BufferedRWPair は、読み取り可能、書き込み可能、および読み取り可能と書き込み可能の両方のバッファーストリームです。 BufferedRandom は、ランダムアクセスストリームへのバッファリングされたインターフェイスを提供します。 もう1つの BufferedIOBase サブクラス BytesIO は、メモリ内バイトのストリームです。
IOBase の別のサブクラスである TextIOBase ABCは、バイトがテキストを表すストリームを処理し、文字列との間のエンコードとデコードを処理します。 それを拡張する TextIOWrapper は、バッファリングされたrawストリーム( BufferedIOBase )へのバッファリングされたテキストインターフェイスです。 最後に、 StringIO はテキストのメモリ内ストリームです。
引数名は仕様の一部ではなく、 open()の引数のみがキーワード引数として使用されることを目的としています。
次の表は、 io モジュールによって提供されるABCをまとめたものです。
ABC | 継承 | スタブメソッド | Mixinのメソッドとプロパティ |
---|---|---|---|
IOBase
|
fileno 、seek 、およびtruncate
|
close 、closed 、__enter__ 、__exit__ 、flush 、isatty 、__iter__ 、[ X77X] 、readable 、readline 、readlines 、seekable 、tell 、writable 、および[ X166X]
| |
RawIOBase
|
IOBase
|
readinto およびwrite
|
継承された IOBase メソッド、read 、およびreadall
|
BufferedIOBase
|
IOBase
|
detach 、read 、read1 、およびwrite
|
継承された IOBase メソッド、readinto 、およびreadinto1
|
TextIOBase
|
IOBase
|
detach 、read 、readline 、およびwrite
|
継承された IOBase メソッド、encoding 、errors 、およびnewlines
|
16.2.3.1。 I / O基本クラス
- class io.IOBase
バイトのストリームに作用する、すべてのI / Oクラスの抽象基本クラス。 パブリックコンストラクタはありません。
このクラスは、派生クラスが選択的にオーバーライドできる多くのメソッドに空の抽象実装を提供します。 デフォルトの実装は、読み取り、書き込み、またはシークできないファイルを表します。
IOBase は
read()
、readinto()
、またはwrite()
を宣言しませんが、それらの署名は異なるため、実装とクライアントはこれらのメソッドをインターフェイスの一部と見なす必要があります。 また、実装は、サポートしていない操作が呼び出されたときに ValueError (または UnsupportedOperation )を発生させる可能性があります。ファイルからの読み取りまたはファイルへの書き込みに使用される基本的なタイプは、 bytes です。 他のバイトのようなオブジェクトもメソッド引数として受け入れられます。 readinto()などの場合、 bytearray などの書き込み可能なオブジェクトが必要になります。 テキストI / Oクラスは、 str データを処理します。
クローズドストリームでのメソッドの呼び出し(問い合わせも含む)は定義されていないことに注意してください。 この場合、実装によって ValueError が発生する可能性があります。
IOBase (およびそのサブクラス)はイテレータープロトコルをサポートします。つまり、 IOBase オブジェクトは、ストリーム内の行を生成する際に反復できます。 行の定義は、ストリームがバイナリストリーム(バイトを生成する)であるか、テキストストリーム(文字列を生成する)であるかによってわずかに異なります。 以下の readline()を参照してください。
IOBase はコンテキストマネージャーでもあるため、 with ステートメントをサポートします。 この例では、 file は、 with ステートメントのスイートが終了した後、例外が発生した場合でも閉じられます。
with open('spam.txt', 'w') as file: file.write('Spam and eggs!')
IOBase は、次のデータ属性とメソッドを提供します。
- close()
このストリームをフラッシュして閉じます。 ファイルがすでに閉じられている場合、この方法は効果がありません。 ファイルが閉じられると、ファイルに対するすべての操作(例: 読み取りまたは書き込み)は、 ValueError を発生させます。
便宜上、このメソッドを複数回呼び出すことができます。 ただし、最初の呼び出しのみが効果を発揮します。
- closed
True
ストリームが閉じている場合。
- fileno()
ストリームの基になるファイル記述子(整数)が存在する場合はそれを返します。 IOオブジェクトがファイル記述子を使用しない場合、 OSError が発生します。
- flush()
必要に応じて、ストリームの書き込みバッファをフラッシュします。 これは、読み取り専用および非ブロッキングストリームには何もしません。
- isatty()
ストリームがインタラクティブである(つまり、端末/ ttyデバイスに接続されている)場合は、
True
を返します。
- readable()
ストリームを読み取ることができる場合は、
True
を返します。False
の場合、read()
は OSError を発生させます。
- readline(size=- 1)
ストリームから1行を読み取り、返します。 size を指定した場合、最大で size バイトが読み取られます。
バイナリファイルの場合、行末記号は常に
b'\n'
です。 テキストファイルの場合、 open()の newline 引数を使用して、認識される行末記号を選択できます。
- readlines(hint=- 1)
ストリームから行のリストを読み取って返します。 ヒントを指定して、読み取る行数を制御できます。これまでのすべての行の合計サイズ(バイト/文字)がヒントを超えると、それ以上の行は読み取られません。
file.readlines()
を呼び出さなくても、for line in file: ...
を使用してファイルオブジェクトを反復処理することはすでに可能であることに注意してください。
- seek(offset[, whence])
ストリーム位置を指定されたバイトオフセットに変更します。 offset は、 whence で示される位置を基準にして解釈されます。 whence のデフォルト値は
SEEK_SET
です。 whence の値は次のとおりです。SEEK_SET
または0
–ストリームの開始(デフォルト)。 オフセットはゼロまたは正である必要がありますSEEK_CUR
または1
–現在のストリーム位置。 オフセットは負の可能性がありますSEEK_END
または2
–ストリームの終わり。 オフセットは通常負です
新しい絶対位置を返します。
バージョン3.1の新機能:
SEEK_*
定数。バージョン3.3の新機能:一部のオペレーティングシステムは、
os.SEEK_HOLE
やos.SEEK_DATA
などの追加の値をサポートする可能性があります。 ファイルの有効な値は、テキストモードまたはバイナリモードで開いているかどうかによって異なります。
- seekable()
ストリームがランダムアクセスをサポートしている場合は、
True
を返します。False
、 seek()、 tell()、および truncate()の場合、 OSError が発生します。
- tell()
現在のストリーム位置を返します。
- truncate(size=None)
ストリームのサイズを、指定された size (バイト単位)(または size が指定されていない場合は現在の位置)に変更します。 現在のストリーム位置は変更されません。 このサイズ変更により、現在のファイルサイズを拡大または縮小できます。 拡張子の場合、新しいファイル領域の内容はプラットフォームによって異なります(ほとんどのシステムでは、追加のバイトはゼロで埋められます)。 新しいファイルサイズが返されます。
バージョン3.5で変更: Windowsは拡張時にファイルをゼロフィルするようになりました。
- writable()
ストリームが書き込みをサポートしている場合は、
True
を返します。False
の場合、write()
および truncate()は OSError を発生させます。
- writelines(lines)
行のリストをストリームに書き込みます。 行区切り記号は追加されないため、通常、提供される各行の最後に行区切り記号があります。
- class io.RawIOBase
生のバイナリI / Oの基本クラス。 IOBase を継承します。 パブリックコンストラクタはありません。
生のバイナリI / Oは通常、基盤となるOSデバイスまたはAPIへの低レベルのアクセスを提供し、高レベルのプリミティブにカプセル化しようとはしません(これは、バッファI / OとテキストI / Oに委ねられます。これについては、後で説明します)。ページ)。
IOBase の属性とメソッドに加えて、 RawIOBase は次のメソッドを提供します。
- read(size=- 1)
オブジェクトから最大サイズバイトを読み取り、それらを返します。 便宜上、 size が指定されていないか-1の場合、EOFまでのすべてのバイトが返されます。 それ以外の場合、システムコールは1回だけ行われます。 オペレーティングシステムコールがサイズバイト未満を返す場合、サイズバイト未満が返される場合があります。
0バイトが返され、 size が0でない場合、これはファイルの終わりを示します。 オブジェクトが非ブロッキングモードであり、使用可能なバイトがない場合、
None
が返されます。デフォルトの実装は、 readall()および readinto()に従います。
- readall()
必要に応じてストリームへの複数の呼び出しを使用して、ストリームからEOFまでのすべてのバイトを読み取って返します。
- readinto(b)
事前に割り当てられた書き込み可能なバイトのようなオブジェクト b にバイトを読み取り、読み取られたバイト数を返します。 オブジェクトが非ブロッキングモードであり、使用可能なバイトがない場合、
None
が返されます。
- write(b)
指定されたバイトのようなオブジェクト、 b を基になるrawストリームに書き込み、書き込まれたバイト数を返します。 これは、基になるrawストリームの詳細に応じて、特に非ブロッキングモードの場合は、バイト単位の b の長さよりも短くなる可能性があります。
None
は、生のストリームがブロックしないように設定されていて、1バイトを簡単に書き込むことができない場合に返されます。 呼び出し元は、このメソッドが戻った後に b を解放または変更する可能性があるため、実装はメソッド呼び出し中にのみ b にアクセスする必要があります。
- class io.BufferedIOBase
ある種のバッファリングをサポートするバイナリストリームの基本クラス。 IOBase を継承します。 パブリックコンストラクタはありません。
RawIOBase との主な違いは、メソッド read()、 readinto()、および write()が(それぞれ)読み取りを試みることです。おそらく複数のシステムコールを行うことを犠牲にして、要求されただけの入力、または指定されたすべての出力を消費します。
さらに、これらのメソッドは、基になるrawストリームが非ブロッキングモードであり、十分なデータを取得または提供できない場合、 BlockingIOError を発生させる可能性があります。 RawIOBase の対応物とは異なり、
None
を返すことはありません。さらに、 read()メソッドには、 readinto()に従うデフォルトの実装がありません。
一般的な BufferedIOBase 実装は、 RawIOBase 実装から継承するべきではありませんが、 BufferedWriter や BufferedReader のようにラップします。
BufferedIOBase は、 IOBase のメソッドと属性に加えて、これらのメソッドと属性を提供またはオーバーライドします。
- raw
BufferedIOBase が処理する基になるrawストリーム( RawIOBase インスタンス)。 これは BufferedIOBase APIの一部ではなく、一部の実装には存在しない可能性があります。
- detach()
基になるrawストリームをバッファーから分離し、それを返します。
生のストリームが切り離された後、バッファは使用できない状態になります。
BytesIO などの一部のバッファーには、このメソッドから返される単一のrawストリームの概念がありません。 UnsupportedOperation を発生させます。
バージョン3.1の新機能。
- read(size=- 1)
最大サイズバイトを読み取って返します。 引数が省略されている場合、
None
、または負の場合、データが読み取られ、EOFに達するまで返されます。 ストリームがすでにEOFにある場合は、空の bytes オブジェクトが返されます。引数が正で、基になるrawストリームが対話型でない場合、バイトカウントを満たすために複数のraw読み取りが発行される場合があります(最初にEOFに到達しない限り)。 ただし、インタラクティブなrawストリームの場合、最大で1つのraw読み取りが発行され、短い結果はEOFが差し迫っていることを意味しません。
BlockingIOError は、基になるrawストリームが非ブロッキングモードであり、現在利用可能なデータがない場合に発生します。
- read1(size=- 1)
基になるrawストリームの read()(または readinto())メソッドを最大1回呼び出して、最大 size バイトを読み取って返します。 これは、 BufferedIOBase オブジェクトの上に独自のバッファリングを実装している場合に役立ちます。
- readinto(b)
事前に割り当てられた書き込み可能なバイトのようなオブジェクト b にバイトを読み取り、読み取られたバイト数を返します。
read()と同様に、基になるrawストリームが対話型でない限り、複数の読み取りが基になるrawストリームに発行される場合があります。
BlockingIOError は、基になるrawストリームが非ブロッキングモードであり、現在利用可能なデータがない場合に発生します。
- readinto1(b)
基になるrawストリームの read()(またはへの最大1回の呼び出しを使用して、事前に割り当てられた書き込み可能なバイトのようなオブジェクト b にバイトを読み取ります] readinto())メソッド。 読み取られたバイト数を返します。
BlockingIOError は、基になるrawストリームが非ブロッキングモードであり、現在利用可能なデータがない場合に発生します。
バージョン3.5の新機能。
- write(b)
指定されたバイトのようなオブジェクト、 b を書き込み、書き込まれたバイト数を返します( b の長さに常に等しいバイト単位で、書き込みの場合は失敗すると、 OSError が発生します)。 実際の実装に応じて、これらのバイトは、基になるストリームに簡単に書き込まれるか、パフォーマンスと遅延の理由でバッファーに保持される場合があります。
非ブロッキングモードでは、データをrawストリームに書き込む必要があるが、ブロッキングなしですべてのデータを受け入れることができない場合、 BlockingIOError が発生します。
呼び出し元は、このメソッドが戻った後に b を解放または変更する可能性があるため、実装はメソッド呼び出し中にのみ b にアクセスする必要があります。
16.2.3.2。 RawファイルI / O
- class io.FileIO(name, mode='r', closefd=True, opener=None)
FileIO は、バイトデータを含むOSレベルのファイルを表します。 RawIOBase インターフェイス(したがって、 IOBase インターフェイスも)を実装します。
名前は、次の2つのいずれかになります。
開かれるファイルへのパスを表す文字列または bytes オブジェクト。 この場合、closefdは
True
(デフォルト)である必要があります。そうでない場合、エラーが発生します。結果の FileIO オブジェクトがアクセスを許可する既存のOSレベルのファイル記述子の番号を表す整数。 FileIOオブジェクトが閉じられると、 closefd が
False
に設定されていない限り、このfdも閉じられます。
モードは、読み取り(デフォルト)、書き込み、排他的作成、または追加のために、
'r'
、'w'
、'x'
、または'a'
にすることができます。 書き込みまたは追加のために開いたときにファイルが存在しない場合、ファイルが作成されます。 書き込み用に開くと切り捨てられます。 FileExistsError は、作成のために開いたときにすでに存在する場合に発生します。 作成のためにファイルを開くことは書き込みを意味するため、このモードは'w'
と同じように動作します。 モードに'+'
を追加して、読み取りと書き込みを同時に実行できるようにします。このクラスの
read()
(正の引数で呼び出された場合)、readinto()
、およびwrite()
メソッドは、1回のシステムコールのみを行います。カスタムオープナーは、呼び出し可能オブジェクトをオープナーとして渡すことで使用できます。 次に、ファイルオブジェクトの基になるファイル記述子は、オープナーを(名前、フラグ)で呼び出すことによって取得されます。 opener は、開いているファイル記述子を返す必要があります( os.open を opener として渡すと、
None
を渡すのと同様の機能になります)。新しく作成されたファイルは継承不可です。
opener パラメーターの使用例については、 open()組み込み関数を参照してください。
バージョン3.3で変更: opener パラメーターが追加されました。
'x'
モードが追加されました。バージョン3.4で変更:ファイルは継承できなくなりました。
IOBase および RawIOBase の属性とメソッドに加えて、 FileIO は次のデータ属性を提供します。
- mode
コンストラクターで指定されたモード。
- name
ファイル名。 これは、コンストラクターで名前が指定されていない場合のファイルのファイル記述子です。
16.2.3.3。 バッファリングされたストリーム
バッファリングされたI / Oストリームは、生のI / Oよりも高レベルのインターフェイスをI / Oデバイスに提供します。
- class io.BytesIO([initial_bytes])
インメモリバイトバッファを使用したストリーム実装。 BufferedIOBase を継承します。 close()メソッドが呼び出されると、バッファーは破棄されます。
オプションの引数 initial_bytes は、初期データを含む bytesのようなオブジェクトです。
BytesIO は、 BufferedIOBase および IOBase のメソッドに加えて、これらのメソッドを提供またはオーバーライドします。
- getbuffer()
バッファの内容をコピーせずに、読み取りと書き込みが可能なビューを返します。 また、ビューを変更すると、バッファーの内容が透過的に更新されます。
>>> b = io.BytesIO(b"abcdef") >>> view = b.getbuffer() >>> view[2:4] = b"56" >>> b.getvalue() b'ab56ef'
ノート
ビューが存在する限り、 BytesIO オブジェクトのサイズを変更したり閉じたりすることはできません。
バージョン3.2の新機能。
- getvalue()
バッファの内容全体を含むバイトを返します。
- read1()
BytesIO では、これは
read()
と同じです。
- readinto1()
BytesIO では、これは
readinto()
と同じです。バージョン3.5の新機能。
- class io.BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE)
読み取り可能なシーケンシャル RawIOBase オブジェクトへの高レベルのアクセスを提供するバッファー。 BufferedIOBase を継承します。 このオブジェクトからデータを読み取る場合、基になるrawストリームから大量のデータが要求され、内部バッファーに保持される場合があります。 バッファリングされたデータは、その後の読み取りで直接返すことができます。
コンストラクターは、指定された読み取り可能な raw ストリームおよび buffer_size に対して BufferedReader を作成します。 buffer_size を省略すると、 DEFAULT_BUFFER_SIZE が使用されます。
BufferedReader は、 BufferedIOBase および IOBase のメソッドに加えて、これらのメソッドを提供またはオーバーライドします。
- peek([size])
位置を進めずにストリームからバイトを返します。 呼び出しを満たすために、生のストリームで最大1回の読み取りが行われます。 返されるバイト数は、要求された数より少ない場合と多い場合があります。
- read([size])
size バイトを読み取って返すか、 size が指定されていないか負の場合は、EOFまで、または読み取り呼び出しが非ブロッキングモードでブロックされるかどうか。
- read1(size)
生のストリームを1回呼び出すだけで、最大 size バイトを読み取って返します。 少なくとも1バイトがバッファリングされている場合、バッファリングされたバイトのみが返されます。 それ以外の場合は、生のストリーム読み取り呼び出しが1回行われます。
- class io.BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE)
書き込み可能なシーケンシャル RawIOBase オブジェクトへの高レベルのアクセスを提供するバッファー。 BufferedIOBase を継承します。 このオブジェクトに書き込む場合、データは通常、内部バッファに配置されます。 バッファは、次のようなさまざまな条件下で、基になる RawIOBase オブジェクトに書き出されます。
保留中のすべてのデータに対してバッファが小さくなりすぎた場合。
flush()が呼び出されたとき。
seek()
が要求されたとき( BufferedRandom オブジェクトの場合)。BufferedWriter オブジェクトが閉じられたときまたは破棄されたとき。
コンストラクターは、指定された書き込み可能な raw ストリームに対して BufferedWriter を作成します。 buffer_size が指定されていない場合、デフォルトで DEFAULT_BUFFER_SIZE になります。
BufferedWriter は、 BufferedIOBase および IOBase のメソッドに加えて、これらのメソッドを提供またはオーバーライドします。
- flush()
バッファに保持されているバイトを生のストリームに強制します。 生のストリームがブロックされる場合は、 BlockingIOError が発生する必要があります。
- write(b)
バイトのようなオブジェクト、 b を書き込み、書き込まれたバイト数を返します。 非ブロッキングモードの場合、バッファを書き出す必要があるが生のストリームがブロックされると、 BlockingIOError が発生します。
- class io.BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE)
ランダムアクセスストリームへのバッファリングされたインターフェイス。 BufferedReader および BufferedWriter を継承し、さらに
seek()
およびtell()
機能をサポートします。コンストラクターは、最初の引数で指定された、シーク可能なrawストリームのリーダーとライターを作成します。 buffer_size を省略すると、デフォルトで DEFAULT_BUFFER_SIZE になります。
BufferedRandom は、 BufferedReader または BufferedWriter が実行できるすべての機能を備えています。
- class io.BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE)
2つの単方向 RawIOBase オブジェクト(一方は読み取り可能、もう一方は書き込み可能)を単一の双方向エンドポイントに結合するバッファー付きI / Oオブジェクト。 BufferedIOBase を継承します。
reader と writer は、それぞれ読み取りと書き込みが可能な RawIOBase オブジェクトです。 buffer_size を省略すると、デフォルトで DEFAULT_BUFFER_SIZE になります。
BufferedRWPair は、 UnsupportedOperation を発生させる detach()を除いて、 BufferedIOBase 'のすべてのメソッドを実装します。
警告
BufferedRWPair は、基になるrawストリームへのアクセスを同期しようとしません。 リーダーやライターと同じオブジェクトを渡さないでください。 代わりに BufferedRandom を使用してください。
16.2.3.4。 テキストI / O
- class io.TextIOBase
テキストストリームの基本クラス。 このクラスは、I / Oをストリーミングするための文字および行ベースのインターフェイスを提供します。 Pythonの文字列は不変であるため、
readinto()
メソッドはありません。 IOBase を継承します。 パブリックコンストラクタはありません。TextIOBase は、 IOBase のものに加えて、これらのデータ属性とメソッドを提供またはオーバーライドします。
- encoding
ストリームのバイトを文字列にデコードし、文字列をバイトにエンコードするために使用されるエンコーディングの名前。
- errors
デコーダーまたはエンコーダーのエラー設定。
- newlines
文字列、文字列のタプル、または
None
は、これまでに翻訳された改行を示します。 実装と初期コンストラクタフラグによっては、これが利用できない場合があります。
- buffer
TextIOBase が処理する基になるバイナリバッファー( BufferedIOBase インスタンス)。 これは TextIOBase APIの一部ではなく、一部の実装には存在しない可能性があります。
- detach()
基になるバイナリバッファを TextIOBase から分離し、それを返します。
基になるバッファがデタッチされた後、 TextIOBase は使用できない状態になります。
StringIO などの一部の TextIOBase 実装には、基になるバッファーの概念がない場合があり、このメソッドを呼び出すと UnsupportedOperation が発生します。
バージョン3.1の新機能。
- read(size=- 1)
ストリームから最大サイズ文字を読み取り、単一の str として返します。 size が負または
None
の場合、EOFまで読み取ります。
- readline(size=- 1)
改行またはEOFまで読み取り、単一の
str
を返します。 ストリームがすでにEOFにある場合は、空の文字列が返されます。size を指定した場合、最大で size 文字が読み取られます。
- seek(offset[, whence])
ストリームの位置を指定されたオフセットに変更します。 動作は whence パラメーターによって異なります。 whence のデフォルト値は
SEEK_SET
です。SEEK_SET
または0
:ストリームの先頭からシークします(デフォルト)。 offset は、 TextIOBase.tell()によって返される数値、またはゼロのいずれかである必要があります。 その他の offset 値は、未定義の動作を生成します。SEEK_CUR
または1
:現在の位置に「シーク」します。 offset はゼロでなければなりません。これは操作なしです(他のすべての値はサポートされていません)。SEEK_END
または2
:ストリームの最後までシークします。 offset はゼロでなければなりません(他のすべての値はサポートされていません)。
新しい絶対位置を不透明な数値として返します。
バージョン3.1の新機能:
SEEK_*
定数。
- tell()
現在のストリーム位置を不透明な数値として返します。 この数値は通常、基になるバイナリストレージのバイト数を表すものではありません。
- write(s)
文字列 s をストリームに書き込み、書き込まれた文字数を返します。
- class io.TextIOWrapper(buffer, encoding=None, errors=None, newline=None, line_buffering=False, write_through=False)
BufferedIOBase バイナリストリーム上のバッファリングされたテキストストリーム。 TextIOBase を継承します。
encoding は、ストリームがデコードまたはエンコードされるエンコードの名前を示します。 デフォルトは locale.getpreferredencoding(False)です。
errors は、エンコードおよびデコードエラーの処理方法を指定するオプションの文字列です。 エンコードエラーがある場合は
'strict'
を渡して ValueError 例外を発生させるか(デフォルトのNone
でも同じ効果があります)、'ignore'
を渡して無視しますエラー。 (エンコードエラーを無視すると、データが失われる可能性があることに注意してください。)'replace'
を使用すると、データの形式が正しくない場所に置換マーカー('?'
など)が挿入されます。'backslashreplace'
により、不正な形式のデータがバックスラッシュされたエスケープシーケンスに置き換えられます。 書き込み時には、'xmlcharrefreplace'
(適切なXML文字参照に置き換えてください)または'namereplace'
(\N{...}
エスケープシーケンスに置き換えてください)を使用できます。 codecs.register_error()に登録されているその他のエラー処理名も有効です。newline は、行末の処理方法を制御します。
None
、、
'\n'
、'\r'
、および'\r\n'
にすることができます。 これは次のように機能します。ストリームから入力を読み取るときに、改行が
None
の場合、ユニバーサル改行モードが有効になります。 入力の行は、'\n'
、'\r'
、または'\r\n'
で終わる可能性があり、これらは呼び出し元に返される前に'\n'
に変換されます。の場合、ユニバーサル改行モードが有効になりますが、行末は変換されずに呼び出し元に返されます。 他の有効な値のいずれかがある場合、入力行は指定された文字列でのみ終了し、行の終了は変換されずに呼び出し元に返されます。
ストリームに出力を書き込むときに、 newline が
None
の場合、書き込まれた'\n'
文字はすべて、システムのデフォルトの行区切り文字 os.linesep に変換されます。 。 改行がまたは
'\n'
の場合、変換は行われません。 newline が他の有効な値のいずれかである場合、書き込まれた'\n'
文字はすべて指定された文字列に変換されます。
line_buffering が
True
の場合、writeの呼び出しに改行文字またはキャリッジリターンが含まれていると、flush()
が暗黙指定されます。write_through が
True
の場合、write()
への呼び出しはバッファリングされないことが保証されます。バイナリバッファ。バージョン3.3で変更: write_through 引数が追加されました。
バージョン3.3で変更:デフォルトのエンコーディングは、
locale.getpreferredencoding()
ではなくlocale.getpreferredencoding(False)
になりました。 locale.setlocale()を使用して一時的にロケールエンコーディングを変更しないでください。ユーザーが優先するエンコーディングの代わりに、現在のロケールエンコーディングを使用してください。TextIOWrapper は、 TextIOBase とその親の属性に加えて、次の1つの属性を提供します。
- line_buffering
ラインバッファリングが有効かどうか。
- class io.StringIO(initial_value=, newline='\\n')
テキストI / O用のインメモリストリーム。 close()メソッドが呼び出されると、テキストバッファは破棄されます。
バッファの初期値は、 initial_value を指定することで設定できます。 改行変換が有効になっている場合、改行は write()のようにエンコードされます。 ストリームはバッファの先頭に配置されます。
newline 引数は、 TextIOWrapper の引数と同じように機能します。 デフォルトでは、
\n
文字のみが行の終わりと見なされ、改行の変換は行われません。 newline がNone
に設定されている場合、すべてのプラットフォームで改行は\n
として書き込まれますが、読み取り時にユニバーサル改行デコードが実行されます。StringIO は、 TextIOBase とその親からのメソッドに加えて、このメソッドを提供します。
- getvalue()
バッファの内容全体を含む
str
を返します。 改行は read()のようにデコードされますが、ストリームの位置は変更されません。
使用例:
import io output = io.StringIO() output.write('First line.\n') print('Second line.', file=output) # Retrieve file contents -- this will be # 'First line.\nSecond line.\n' contents = output.getvalue() # Close object and discard memory buffer -- # .getvalue() will now raise an exception. output.close()
- class io.IncrementalNewlineDecoder
- ユニバーサル改行モードの改行をデコードするヘルパーコーデック。 codecs.IncrementalDecoder を継承します。
16.2.4。 パフォーマンス
このセクションでは、提供されている具体的なI / O実装のパフォーマンスについて説明します。
16.2.4.1。 バイナリI / O
バッファ付きI / Oは、ユーザーが1バイトを要求した場合でもデータの大きなチャンクのみを読み書きすることにより、オペレーティングシステムのバッファなしI / Oルーチンの呼び出しと実行における非効率性を隠します。 ゲインは、OSと実行されるI / Oの種類によって異なります。 たとえば、Linuxなどの一部の最新のOSでは、バッファなしのディスクI / Oはバッファ付きのI / Oと同じくらい高速です。 ただし、要点は、バッファリングされたI / Oは、プラットフォームやバッキングデバイスに関係なく予測可能なパフォーマンスを提供するということです。 したがって、ほとんどの場合、バイナリデータにはバッファなしI / Oではなくバッファ付きI / Oを使用することをお勧めします。
16.2.4.2。 テキストI / O
バイナリストレージ(ファイルなど)でのテキストI / Oは、文字コーデックを使用したUnicodeとバイナリデータ間の変換が必要なため、同じストレージでのバイナリI / Oよりも大幅に低速です。 これは、大きなログファイルのような大量のテキストデータの処理で顕著になる可能性があります。 また、TextIOWrapper.tell()
とTextIOWrapper.seek()
はどちらも、使用されている再構成アルゴリズムのために非常に低速です。
ただし、 StringIO はネイティブのメモリ内Unicodeコンテナであり、 BytesIO と同様の速度を示します。
16.2.4.3。 マルチスレッド
FileIO オブジェクトは、それらがラップするオペレーティングシステムコール(Unixのread(2)
など)がスレッドセーフである限り、スレッドセーフです。
バイナリバッファオブジェクト( BufferedReader 、 BufferedWriter 、 BufferedRandom 、 BufferedRWPair のインスタンス)は、ロックを使用して内部構造を保護します。 したがって、一度に複数のスレッドからそれらを呼び出すことは安全です。
TextIOWrapper オブジェクトはスレッドセーフではありません。
16.2.4.4。 再入可能
バイナリバッファオブジェクト( BufferedReader 、 BufferedWriter 、 BufferedRandom 、および BufferedRWPair のインスタンス)は再入可能ではありません。 再入可能な呼び出しは通常の状況では発生しませんが、 signal ハンドラーでI / Oを実行することで発生する可能性があります。 スレッドがすでにアクセスしているバッファリングされたオブジェクトを再入力しようとすると、 RuntimeError が発生します。 これは、別のスレッドがバッファリングされたオブジェクトに入るのを禁止しないことに注意してください。
open()関数はバッファリングされたオブジェクトを TextIOWrapper 内にラップするため、上記は暗黙的にテキストファイルに拡張されます。 これには標準ストリームが含まれるため、組み込み関数 print()にも影響します。