今日は、PythonのIOモジュールの使い方を紹介します。
このモジュールは、ファイルに関するI/O操作(例:ファイルの読み書き)を行いたい場合に非常に便利です。
ファイルの読み書きには通常の read()
と write()
メソッドが使えますが、このモジュールはこれらの操作に関してより柔軟性を与えてくれます。
このモジュールについてより深く理解するために、いくつかの例を挙げてみましょう。
この記事もチェック:Pythonのstatisticsモジュールで便利なメソッドを7つ紹介する
Python IO モジュール
このモジュールは標準ライブラリの一部なので、pipを使って別途インストールする必要はありません。
io モジュールをインポートするには、以下のようにします。
import io
|
IOモジュールには2つのクラスがあり、非常に便利です。
- BytesIO -> バイトデータに対するI/O操作。
- StringIO -> 文字列データに対する入出力操作
これらのクラスにアクセスするには、 io.BytesIO
と io.StringIO
を使用します。
それでは、1つずつ見ていきましょう。
Python BytesIO クラス
H
Python StringIO クラス
io.BytesIO
と同様に、 io.StringIO
クラスは StringIO バッファから文字列関連のデータを読み込むことができる。
import io
bytes_stream = io.BytesIO(b 'Hello from Journaldevx0AHow are you?' )
|
文字列バッファからデータを読み込むには string_stream.read()
を、書き込むには string_stream.write()
を使用します。
これは、ファイルからの読み込み/書き込みと非常によく似ています。
また、getvalue()
を用いて内容を表示することができます。
import io
bytes_stream = io.BytesIO(b 'Hello from Journaldevx0AHow are you?' )
print (bytes_stream.getvalue())
|
結果は以下の通りです。
b 'Hello from Journaldev
|
同じバッファに書き込んでいるので、新しいコンテンツは明らかに古いものを上書きします!
この記事もチェック:Pythonのmmapの使い方|ファイルのreadやwriteのやり方を解説
StringIOバッファからの読み込み
書き込みと同様に、buffer.read()
を使用して StringIO バッファから読み込むことができます。
bytes_stream.close() |
結果は以下の通りです。
import io
string_stream = io.StringIO( "Hello from Journaldev )
|
見ての通り、内容は読み込んだバッファの中に入っており、 buffer.read()
を使って出力されます。
io を使ってファイルを読み込む
ファイルオブジェクトから読み込むのと同様に、io.open()
メソッドを使用してファイルから直接読み込むことができます。
ここで、このモジュールはバッファードリードとノンバッファードリードのオプションを与えてくれます。
例えば、次の例では buffering = SIZE
と設定することで、バッファードリードを使用してファイルを読み込んでいます。
例えば、 sample.txt
が以下のような内容であるとします。
import io
string_stream = io.StringIO( "Hello from Journaldev )
# Print old content of buffer print (f 'Initially, buffer: {string_stream.getvalue()}' )
# Write to the StringIO buffer string_stream.write( 'This will overwrite the old content of the buffer if the length of this string exceeds the old content' )
print (f 'Finally, buffer: {string_stream.getvalue()}' )
# Close the buffer string_stream.close() |
Initially, buffer: Hello from Journaldev How are you? Finally, buffer: This will overwrite the old content of the buffer if the length of this string exceeds the old content |
結果は以下の通りです。
import io
input = io.StringIO( 'This goes into the read buffer.' )
print ( input .read())
|
見ての通り、このファイルは正常に読み込まれました! ここでは、io
が約5バイトのバッファサイズを使用してファイルを読み込みます。
io.open() と os.open() の使い分け
io.open()関数は、高レベルのPythonicインターフェースとして作られているため、I/O操作を実行する方法として非常に好まれています。
それに対して、os.open()
は open()
関数へのシステムコールを実行します。
これはファイルディスクリプタを返すので、io
ハンドルオブジェクトのように使うことはできません。
io.open()
は os.open()
のラッパー関数であり、多くのエラーを自動的に処理してくれるので、一般にこのようなラッパー関数を使用することは良い習慣です。
まとめ
この記事では、Python IO モジュールとその 2 つの主要なクラスである io.BytesIO
と io.StringIO
を使用して、バイトデータと文字列データをバッファに読み書きする方法について学びました。