module function Kernel.#open

open(file, mode_enc = "r", perm = 0666) -> IO[permalink][rdoc][edit]
open(file, mode_enc = "r", perm = 0666) {|io| ... } -> object

file をオープンして、IOFileを含む)クラスのインスタンスを返します。

ブロックが与えられた場合、指定されたファイルをオープンし、生成した IO オブジェクトを引数としてブロックを実行します。ブロックの終了時や例外によりブロックを脱出するとき、ファイルをクローズします。ブロックを評価した結果を返します。

ファイル名 file が `|' で始まる時には続く文字列をコマンドとして起動し、コマンドの標準入出力に対してパイプラインを生成します

ファイル名が "|-" である時、open は Ruby の子プロセスを生成し、その子プロセスとの間のパイプ(IOオブジェクト)を返します。(このときの動作は、IO.popen と同じです。 File.open にはパイプラインを生成する機能はありません)。

Perlと異なりコマンドは常に `|' で始まります。

[PARAM] file:
ファイルを文字列で指定します。整数を指定した場合はファイルディスクリプタとして扱います。
[PARAM] mode_enc:
モード・エンコーディングを文字列か定数の論理和で指定します。後述。
[PARAM] perm:
open(2) の第 3 引数のように、ファイルを生成する場合のファイルのパーミッションを整数で指定します。
[EXCEPTION] Errno::EXXX:
ファイルのオープンに失敗した場合に発生します。

[SEE_ALSO] File.open,IO.popen,IO.open

第二引数のオープンモード・エンコーディング

文字列("mode" か "mode:ext_enc" か "mode:ext_enc:int_enc" という形式)か整数(File::Constants モジュールの定数の論理和)を組み合わせて指定します。

mode は以下の三つのうちのいずれかです。

"r", RDONLY

ファイルを読み込みモードでオープンします。(デフォルトのモード)

"w", WRONLY|CREAT|TRUNC

ファイルを書き込みモードでオープンします。オープン時にファイルがすでに存在していればその内容を空にします。

"a", WRONLY|CREAT|APPEND

ファイルを書き込みモードでオープンします。出力は 常に ファイルの末尾に追加されます。例えば、ファイルオープン中にファイルのサイズが小さくなってもその末尾に出力されます。

以上の3つの後に "+" があれば、ファイルは読み書き両用モード (RDWR) でオープンされます。

"r+"

ファイルの読み書き位置は先頭にセットされます。

"w+"

"r+" と同じですが、オープン時にファイルがすでに存在していればその内容を空にします。

"a+"

"r+"と同様、ファイルの読み込み位置は先頭にセットされますが、書き込みは常にファイル末尾に行われます。書き込みは IO#seek などの影響を受けません。

これらのいずれに対しても "b" フラグを ("r+b"のように) つけることができます (整数なら File::BINARY )。この場合、バイナリモードでオープンします (ただし、DOS/Windowsのようにシステムがテキスト/バイナリでファイルを区別する場合に限ります)

"w" に対しては "x" フラグを ("wx"や"wb+x"のように) つけることができます (整数なら File::EXCL)。この場合、ファイルがすでに存在すると Errno::EEXIST が発生します。ただし、全ての種類のストリームでサポートされているとは限りません (例えばパイプ)。

Universal Newline

改行をLFに揃えます。一言で言えばPEP:278 https://www.python.org/dev/peps/pep-0278/のことです。

"rt"

CR、LF、CRLFのいずれをもLFとして読み込む。

"rb"

CR、LF、CRLFはいずれもそのまま読み込まれる。

"r"

"rt"と"rb"のどちらの扱いになるかはプラットフォーム依存。 (Unix系ならばなら"rb"、mswinやmingwなら"rt"扱いとなる)

"wb"

LFはそのままLFとして書き込まれる。

"wt" または "w"

LFはLFのままか、CR+LFか、どちらかになる。どちらになるかはプラットフォーム依存。 (Unix系ならばLFのまま、mswinやmingwならばCRLFとなる)

なお、以上のCR、LF、CRLFは入力のエンコーディングを解釈した後に処理されます。例えば、UTF-16LEでは、LFはバイト列"\x0a\x00"のことになります。

エンコーディングの指定

ext_enc(外部エンコーディング)が指定されている場合、読み込まれた文字列にはこのエンコーディングが指定され、出力する文字列はそのエンコーディングに変換されます。

ext_encが'BOM|'で始まる場合、その入力に含まれるBOMはあらかじめ削られます。また、BOMがあった場合、入力された文字列にはそのBOMに対応するエンコーディングが設定されます。

BOMでUTF-16BEかLEかを判別する例

File.open("utf16.txt", "rb:BOM|utf-16"){|file| "..." }

int_encも指定されていた場合、入力された文字列をext_encでエンコーディングされた文字列とみなしてint_encへと変換し、その結果にint_encを設定して返します。