Python

【Python】複数のファイルを一度で読み込む方法

この記事では、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種類の方法があります。

  1. コマンドライン引数からファイル名を受け取る方法
  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()関数 の代わりに指定した関数が使用されます。指定する関数は filenamemode を受け取り、戻り値はファイルオブジェクトにしなければならない。

例えば、以下のような関数を定義して使う。

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 で指定した関数が実行されているのがわかる。

inplace を True にしている場合は ValueError が送出される

まとめ

この記事では、複数のファイルをまとめて読み込む方法を解説しました。

fileinput には 他にも関数が色々定義されています。気になる方は以下のリンクから参照してください。

Linkfileinput --- 複数の入力ストリームをまたいだ行の繰り返し処理をサポートする — Python ドキュメント

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ