今日は、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 bufferprint(f'Initially, buffer: {string_stream.getvalue()}')
# Write to the StringIO bufferstring_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 bufferstring_stream.close() | 
Initially, buffer: Hello from JournaldevHow 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 を使用して、バイトデータと文字列データをバッファに読み書きする方法について学びました。