この記事では、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 ドキュメント
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ