Python io – BytesIO、StringIO

Pythonのioモジュールを使用すると、ファイル関連の入出力操作を管理できます。IOモジュールを使用する利点は、利用可能なクラスや関数を使用してUnicodeデータへの書き込みを可能にする機能を拡張できることです。

Python IOモジュール

Pythonでストリームやバッファ操作を行うためにioモジュールを使用する方法は多岐にわたります。ここではその点を証明するために多くの例を示します。さあ、始めましょう。

Python BytesIO

変数と同様に、ioモジュールのバイトIO操作を使用すると、データをバイトとしてメモリ内バッファに保持することができます。以下は、これをデモンストレーションするサンプルプログラムです:

import io

stream_str = io.BytesIO(b"JournalDev Python: \x00\x01")
print(stream_str.getvalue())

このプログラムの出力を見てみましょう: getvalue()関数は、バッファから値を文字列として取得します。

Python StringIO

BytesIOと非常に似ているStringIOも使用できます。以下は、そのサンプルプログラムです:

import io

data = io.StringIO()
data.write('JournalDev: ')
print('Python.', file=data)

print(data.getvalue())

data.close()

このプログラムの出力を見てみましょう: バッファを使用した後にバッファを閉じることも注意してください。これにより、データがメモリ内に保存されるため、バッファメモリが節約されます。また、オプションの引数を使用して変数のIOストリームを指定するprintメソッドを使用しましたが、これはprintステートメントと完全に互換性があります。

StringIOを使用した読み取り

StringIOバッファにデータを書き込んだ後、それを読み取ることも可能です。次に、コードの断片を見てみましょう:

import io

input = io.StringIO('This goes into the read buffer.')
print(input.read())

このプログラムの出力を見てみましょう:

StringIOを使用したファイルの読み取り

ファイルを読み取り、それをバイトとしてネットワーク上にストリーミングすることも可能です。ioモジュールを使用して、画像などのメディアファイルをバイトに変換することができます。以下は、サンプルプログラムです:

import io

file = io.open("whale.png", "rb", buffering = 0)
print(file.read())

このプログラムの出力を見てみましょう: このプログラムを実行するには、現在のディレクトリにwhale.png画像が存在している必要がありました。

io.open() vs os.open()

io.open()関数は、ファイルI/Oを実行するための高レベルなインターフェースとして作成されているため、I/O操作を実行するためには好ましい方法です。これは、OSレベルのファイルディスクリプタをオブジェクトにラップし、ファイルにPythonらしい方法でアクセスできるようにします。os.open()関数は、低レベルのPOSIXシスコールを処理します。これはPOSIXベースの引数を受け取り、開かれたファイルを表すファイルディスクリプタを返します。ファイルオブジェクトは返されず、返された値にはread()write()の関数はありません。全体として、io.open()関数は単なるos.open()関数のラッパーです。また、os.open()関数は、デフォルトの設定(フラグやモードなど)も設定しますが、io.open()関数はそれを行わず、渡された値に依存します。

結論

このレッスンでは、PythonのIOモジュールの基本的な操作と、BytesIOを使用してUnicode文字を管理する方法について学びました。ただし、ファイルの削除やコピーなどの完全なファイル操作が必要な場合は、python read fileを読んでください。参考文献:APIドキュメント

Source:
https://www.digitalocean.com/community/tutorials/python-io-bytesio-stringio