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

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

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

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

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

全てのファイルはデフォルトでテキストモードでオープンされます。しかし、 `input()` や `FileInput()` をコールする際に mode パラメータを指定すれば、これをオーバーライドすることができます。 オープン中あるいは読み込み中にI/Oエラーが発生した場合には、 `IOError`が発生します。

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

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

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

ファイルのオープン方法を制御するためのオープン時フックは、 `input()` あるいは `FileInput()` の openhook パラメータで設定します。このフックは、ふたつの引数 filename と mode をとる関数でなければなりません。そしてその関数の返り値は オープンしたファイルオブジェクトとなります。このモジュールには、便利な フックが既に用意されています。

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

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

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

  バージョン 2.5 で 変更 された仕様: パラメータ mode および openhook が追加さ れました

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

`filename`( | )

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

`fileno`( | )

  現在のファイルの ``ファイルデスクリプタ'' を整数値で返します。ファイ ルがオープンされていない場合 (最初の行の前、ファイルとファイルの間) は `-1` を返します。 バージョン 2.5 で 新たに追加 された仕様です。

`lineno`( | )

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

`filelineno`( | )

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

`isfirstline`( | )

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

`isstdin`( | )

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

`nextfile`( | )

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

`close`( | )

  シーケンスを閉じます。

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

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

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

  mode を使用すると、`open()` に渡すファイルモードを指 定することができます。これは `'r'`、`'rU'`、`'U'` お よび `'rb'` のうちのいずれかとなります。

  openhook を指定する場合は、ふたつの引数 filename と mode をとる関数でなければなりません。この関数の返り値は、オー プンしたファイルオブジェクトとなります。inplace と openhook を同時に使うことはできません。

  バージョン 2.5 で 変更 された仕様: パラメータ mode および openhook が追加さ れました

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

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

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

このモジュールには、次のふたつのオープン時フックが用意されています。

`hook_compressed`( | filename, mode)

  gzipやbzip2で圧縮された(拡張子が`'.gz'`や`'.bz2'`の) ファイルを、`gzip`モジュールや`bz2`モジュールを使って 透過的にオープンします。ファイルの拡張子が`'.gz'`や `'.bz2'`でない場合は、通常通りファイルをオープンします (つまり、`open()` をコールする際に伸長を行いません)。

  使用例: "`fi = fileinput.FileInput(openhook=fileinput.hook_compressed)`"

  バージョン 2.5 で 新たに追加 された仕様です。

`hook_encoded`( | encoding)

  各ファイルを`codecs.open()`でオープンするフックを返します。 指定したencodingでファイルを読み込みます。

  使用例: "`fi = fileinput.FileInput(openhook=fileinput.hook_encoded("iso-8859-1"))`"

  注意: このフックでは、指定したencodingによっては `FileInput`がUnicode文字列を返す可能性があります。 バージョン 2.5 で 新たに追加 された仕様です。