# 17 `fileinput` -- 複数の入力ストリームをまたいだ行の繰り返し処理をサポートする。

このモジュールは標準入力やファイルの並びにまたがるループを素早く書くため のヘルパークラスと関数を提供しています。

典型的な使い方は以下の通りです:

    import fileinput
    for line in fileinput.input():
        process(line)

このプログラムは`sys.argv[1:]`に含まれる全てのファイルをまたいで繰 り返します。もし該当するものがなければ、`sys.stdin`がデフォルトとし て扱われます。ファイル名として`'-'`が与えられた場合も、 `sys.stdin`に置き換えられます。別のファイル名リストを使いたい時には、 `input()`の最初の引数にリストを与えます。単一ファイル名の文字列 も受け付けます。

全てのファイルはテキストモードでオープンされます。オープン中あるいは読み 込み中にI/Oエラーが発生した場合には、`IOError`が発生します。

`sys.stdin`が2回以上使われた場合は、2回目以降は行を返しません。 ただしインタラクティブに利用している時や明示的にリセット (`sys.stdin.seek(0))`を使う)を行った場合はその限りではありません。

空のファイルは開いた後すぐ閉じられます。 空のファイルはファイル名リストの最後にある場合にしか外部に影響を与えませ ん。

ファイルの最後が改行文字で終っていない場合には、最後に改行文字を追加して 返します。

以下の関数がこのモジュールの基本的なインタフェースです:

`input`( | [files[, inplace[, backup]]])

  `FileInput`クラスのインスタンスを作ります。生成されたインスタンス は、このモジュールの関数群が利用するグローバルな状態として利用されます。 この関数への引数は`FileInput`クラスのコンストラクタへ渡されます。

以下の関数は`input()`関数によって作られたグローバルな状態を利用 します。アクティブな状態が無い場合には、`RuntimeError`が発生し ます。

`filename`( | )

  現在読み込み中のファイル名を返します。一行目が読み込まれる前は `None`を返します。

`lineno`( | )

  最後に読み込まれた行の、累積した行番号を返します。1行目が読み込まれる前 は`0`を返します。最後のファイルの最終行が読み込まれた後には、その 行の行番号を返します。

`filelineno`( | )

  現在のファイル中での行番号を返します。1行目が読み込まれる前は`0`を 返します。最後のファイルの最終行が読み込まれた後には、その 行のファイル中での行番号を返します。

`isfirstline`( | )

  最後に読み込まれた行がファイルの1行目ならTrue、そうでなければFalseを返します。

`isstdin`( | )

  最後に読み込まれた行が`sys.stdin`から読まれていればTrue、そうでなけ ればFalseを返します。

`nextfile`( | )

  現在のファイルを閉じます。次の繰り返しでは(存在すれば)次のファイルの最初 の行が読み込まれます。閉じたファイルの読み込まれなかった行は、累積の行 数にカウントされません。ファイル名は次のファイルの最初の行が読み込まれ るまで変更されません。最初の行の読み込みが行われるまでは、この関数は呼 び出されても何もしませんので、最初のファイルをスキップするために利用す ることはできません。最後のファイルの最終行が読み込まれた後にも、この関 数は呼び出されても何もしません。

`close`( | )

  シーケンスを閉じます。

このモジュールのシーケンスの振舞いを実装しているクラスの サブクラスを作ることもできます。

クラス `FileInput`( | [files[, inplace[, backup]]])

  `FileInput`クラスはモジュールの関数に対応するメソッド `filename()`、`lineno()`、`fileline()`、 `isfirstline()`、`isstdin()`、`nextfile()`、 `close()`を実装しています。それに加えて、次の入力行を返す `readline()`メソッドと、シーケンスの振舞 いの実装をしている`__getitem__()`メソッドがあります。 シーケンスはシーケンシャルに読み込むことしかできません。つまりランダムア クセスと`readline()`を混在させることはできません。

その場で保存するオプション機能:

キーワード引数 `inplace=1` が `input()`か `FileInput`クラスのコンストラクタに渡された場合には、 入力ファイルはバックアップファイルに移動され、標準出力が入力ファイルに設 定されます(バックアップファイルと同じ名前のファイルが既に存在していた 場合には、警告無しに置き替えられます)。 これによって入力ファイルをその場で書き替えるフィルタを書くことができます。 キーワード引数`backup='.<拡張子>'`も与えられていれば、バック アップファイルの拡張子を決めることができます。デフォルトでは `'.bak'`になっています。出力先のファイルが閉じられればバックアップ ファイルは消されます。その場で保存する機能は、標準入力を読み込んでいる間 は無効にされます。

警告: 現在の実装はMS-DOSの8+3ファイルシステムでは動作しません。