この記事では、Python で一度に複数のファイルを読み込む方法を解説します。
open()関数 を複数回呼び出しても実装できますが、fileinputモジュール の input()関数 を使うことで もっと簡単に実装することができます。
それでは、fileinput.input() の使い方を見ていきましょう!
複数のファイルを一度に読み込むには...
fileinputモジュール の input()関数 を使います。
書式は以下の通りです。
import fileinput fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)
fileinput.input() は受け取った引数を fileinput.Fileinputクラス のコンストラクタに渡してインスタンスを生成します。
注意として mode に 'w' や 'a' を指定することはできません。指定できるのは 'r' または 'rb' となり、かならず読み取り専用となります。
ファイルを読み込む方法
fileinput.input() を使ってファイルを読み込むには 2種類の方法があります。
- コマンドライン引数からファイル名を受け取る方法
- files引数 にファイル名を指定する方法
では、実際に2つのファイルを読み込んでみましょう。ここでは実行ファイルと同じディレクトリ内に以下のようなファイル作成して読み込んでみます。
testfile1.txt
testfile1 line1 testfile1 line2 testfile1 line3
testfile2.txt
testfile2 line1 testfile2 line2 testfile2 line3
コマンドライン引数から受け取る
file引数 を指定せずに実行することで コマンドライン引数(sys.argv[1:])に指定したファイルを読み取ることができます。
main.py
import fileinput for line in fileinput.input(): print(line)
実行する際にコマンドライン引数としてファイル名を指定します。
コマンドライン
% python3 main.py testfile1.txt testfile2.txt testfile1 line1 testfile1 line2 testfile1 line3 testfile2 line1 testfile2 line2 testfile2 line3
コマンドライン引数を指定しない、またはファイル名に '-' を指定することで sys.stdin に置き換わるので注意してください。
引数から受け取る
file引数 に読み取りたいファイル名を指定することで 指定したファイルを順番に読み取ることができます。
import fileinput with fileinput.input(files=('testfile1.txt', 'testfile2.txt')) as f: for line in f: print(line)
実行結果
testfile1 line1 testfile1 line2 testfile1 line3 testfile2 line1 testfile2 line2 testfile2 line3
複数のファイルを連続して読み込むことができました。
open関数では満足できない
Fileinputクラス は、内部で opne()関数 を使ってファイルを開いています。
通常の open()関数 では満足できない場合は、openhook引数 に関数を指定することで open()関数 の代わりに指定した関数が使用されます。指定する関数は filename と mode を受け取り、戻り値はファイルオブジェクトにしなければならない。
例えば、以下のような関数を定義して使う。
def openhook(filename, mode): print('opnehook で指定した関数') return open(filename, mode='r')
この関数を使って fileinput.input() を実行してみる。
import fileinput with fileinput.input(files=('testfile1.txt', 'testfile2.txt'), openhook=openhook) as f: for line in f: print(line)
実行結果
opnehook で指定した関数 testfile1 line1 testfile1 line2 testfile1 line3 opnehook で指定した関数 testfile2 line1 testfile2 line2 testfile2 line3
openhook で指定した関数が実行されているのがわかる。
まとめ
この記事では、複数のファイルをまとめて読み込む方法を解説しました。
fileinput には 他にも関数が色々定義されています。気になる方は以下のリンクから参照してください。
Linkfileinput --- 複数の入力ストリームをまたいだ行の繰り返し処理をサポートする — Python ドキュメント
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ


