ストリームと低レベルの入出力

ファイルやパイプはストリームと呼ばれる Mathematica オブジェクトの例である.Mathematica のストリームは入出力のソースである.ストリームにはさまざまな操作を行うことができる.

は高レベルの Mathematica 入出力関数であると考えることができる.これらは,ストリームを直接扱う低レベルの入出力プリミティブを基礎として作られている.これらのプリミティブを使うことによって,Mathematica の入出力をもっと厳密に制御することができる.例えば,中間的なデータをファイルやパイプとやり取りをする Mathematica プログラムを書こうとすれば,これを利用することが必要となる.

出力をストリームに書き出す低レベル手順の基本は次のようである.まず,OpenWriteまたはOpenAppendを実行してストリームを開く.これは,どのファイルまたは外部プログラムに,どんな形式で出力を書き込もうとするかを Mathematica に指定するものである.ストリームが開かれたら,WriteWriteStringを使って実際に式や文字列をそのストリームに書き込む.終ったら,Closeを実行してそのストリームを閉じる.

"name"ファイルを名前で指定
"!name"コマンドを名前で指定
InputStream["name",n]入力ストリーム
OutputStream["name",n]出力ストリーム

Mathematica のストリーム

ファイルまたはパイプを開くと,Mathematica はそのファイルやパイプを対象とするストリームを指定するストリームオブジェクトを作る.一般に,ストリームオブジェクトはファイル名またはパイプで使われる外部コマンド名と,一意的な数を含む.

ストリームオブジェクトが持つこの数は,同一のファイルや外部コマンドに複数のストリームを作ることができるため,それらを区別するのに使われる.例えば,同じ外部プログラムにいくつかのインスタンスを開始すると,それぞれは別のストリームに接続される.

しかし,開いたストリームが1つだけであれば,単にファイル名や外部コマンド名でこのストリームを参照することができる.

ファイルへの出力ストリームを開く.
In[1]:=
Click for copyable input
Out[1]=
式の列をファイルに書き出す.
In[2]:=
Click for copyable input
に開かれているストリームは1つだけであるから,ファイル名を指定するだけでこれを参照することができる.
In[3]:=
Click for copyable input
このストリームを閉じる.
In[4]:=
Click for copyable input
Out[4]=
ファイルの内容を表示する.
OpenWrite["file"]ファイルに出力ストリームを開き,ファイルの内容を消去する
OpenWrite[]新しい一時ファイルに出力ストリームを開く
OpenAppend["file"]ファイルに出力ストリームを開き,ファイルの内容に追記する準備をする
OpenWrite["!command"]外部コマンドに出力ストリームを開く
Write[stream,expr1,expr2,...]式の列をストリームに書き込み,最後に改行する
WriteString[stream,str1,str2,...]文字列をストリームに書き込む,最後に改行しない
Close[stream]ストリームを閉じる

低レベルの出力関数

関数Write[stream, expr]を実行すると,式が指定のストリームに書き込まれる.デフォルトでは Mathematica の入力形で書かれる.式の列を引数としてWriteを実行すると,それらの式を順にストリームに書き出す.一般に,式と式の間にスペースは挿入されない.しかし,すべての式が書かれると,Writeは常に最後に改行する.

ファイルを再び開く.
In[6]:=
Click for copyable input
Out[6]=
式の列をファイルに書き出し,ファイルを閉じる.
In[7]:=
Click for copyable input
Out[7]=
式はすべて入力形で書かれている.1つのWriteで書かれた式は同一の行に書かれる.

WriteMathematica 式を完結した式として書き出す方法である.しかし,場合によってはデータを構造化されていないまま書き出したいこともある.WriteStringは任意の文字列を書き出す.WriteStringWriteと違って,最後に改行やその他の記号を加えない.

ストリームを開く.
In[9]:=
Click for copyable input
Out[9]=
2組の文字列をストリームに書き出す.
In[10]:=
Click for copyable input
文字列をもひとつ書き加えて,ストリームを閉じる.
In[11]:=
Click for copyable input
Out[11]=
ファイルの内容を表示する.文字列は改行も含んでそのままの形で書かれている.
Write[{stream1,stream2},expr1,...]式をストリームに書き出す
WriteString[{stream1,stream2},str1,...]文字列をストリームに書き出す

出力をストリームに書き出す方法

関数WriteWriteStringの重要な機能のひとつは,出力を単に1つのストリームに書くだけでなく,複数のストリームに書けることである.

Mathematica では,複数のストリームのリストを channel として定義しておくと便利である.単にこのチャンネルを指定すれば,Mathematica は同一のオブジェクトを複数のストリームに書き出すことができる.

標準の対話的 Mathematica セッションでは,普通いくつかのチャンネルが利用されている.これらには特定の出力が送られる先が指定されている.したがって,例えば$Outputは標準出力の宛先が,$Messagesにはメッセージの宛先が指定されている.したがって,関数Printは基本的にWrite$Outputに宛てて実行する.同様に,MessageWrite$Messagesに宛てて実行する.「メインループ」に代表的な Mathematica セッションで使われるチャンネルのまとめがある.

MathematicaMathLink で使っているときは普通,別な方法が取られることに注意する.すべての出力は大抵は単一の MathLink リンクに書かれる.個々の出力は型を指定したパケットという形態を取る.

ほとんどの場合,Mathematica の使うファイル名または外部コマンド名は,使っているコンピュータのオペレーティングシステムに準拠している.ただし,システムによっては特殊な名のストリームをサポートしている場合もある.

"stdout"標準出力
"stderr"標準エラー

あるコンピュータシステムにおける特別なストリーム

特別なストリームは出力をオペレーティングシステムの標準出力に送るためのものである.しかし,これはテキスト型インターフェースの Mathematica でのみ使われることに注意する.もっと複雑な使い方をしているときはこのストリームは機能せず,使おうとすると混乱を招くことになる.

オプション名
デフォルト値
FormatTypeInputFormデフォルトの出力フォーマット
PageWidth78ページ幅の文字数
NumberMarks$NumberMarks近似数に を付けて表示
CharacterEncoding$CharacterEncoding特殊文字に使う文字コード

出力ストリームのオプション

出力ストリームにはいくつかのオプションがある.これらのオプションは,OpenWriteOpenAppendで初めにストリームを開くときに指定する.

ストリームを開き,OutputFormを出力フォーマットのデフォルト設定とする.
In[13]:=
Click for copyable input
Out[13]=
式をストリームに書き出し,ストリームを閉じる.
In[14]:=
Click for copyable input
Out[14]=
式はOutputFormで書かれている.

式を書き出すときに特にフォーマットを指定すれば,これがストリームにデフォルトで設定された出力フォーマットより優先される.OutputFormTeXForm等,Mathematica のフォーマット指示子を明示的に指定して,式をストリームに書き出せばよい.

オプションPageWidthMathematica のドキュメントの出力のページ幅を指定する.出力はこの幅に収まるように改行される.改行したくないときはPageWidth->Infinityと指定する.しかし,普通PageWidthには出力機に合わせた数字を与える.多くのシステムでは,この値を見出すためには外部プログラムを走らせる必要がある.SetOptionsを使って,PageWidthのデフォルト値を取得する設定をすることができる.例えばPageWidth:><<"!devicewidth"とすれば,外部プログラムが起動されて適切な値が設定される.

ストリームを開き,ページ幅を20文字とする.
In[16]:=
Click for copyable input
Out[16]=
式を書き込み,ストリームを閉じる.
In[17]:=
Click for copyable input
Out[17]=
書き込まれた式は最大20文字の行に分割されている.

オプションCharacterEncodingは,文字列がWriteまたはWriteStringで特定の出力ストリームに送られるとき,これに使用する文字コード規格を指定する.CharacterEncodingは,主に異なる言語に変換するとき,または出力機が解釈できない文字を受け取らないようにするために使われる.

Options[stream]ストリームに設定されたオプションを見出す
SetOptions[stream,opt1->val1,...]ストリームにオプションを再設定する

ストリームのオプションの操作

デフォルトのオプション設定でストリームを開く.
In[19]:=
Click for copyable input
Out[19]=
オプションFormatTypeを開いたストリームに設定し直す.
In[20]:=
Click for copyable input
Optionsは設定されているオプションを示す.
In[21]:=
Click for copyable input
Out[21]=
ストリームを閉じる.
In[22]:=
Click for copyable input
Out[22]=
Options[$Output]チャンネル($Output)へのすべてのストリームに設定されているオプション
SetOptions[$Output,opt1->val1,...]チャンネル($Output)へのすべてのストリームにオプションを再設定

標準出力チャンネルへのオプションの操作

セッション中は常に,Mathematica は開かれているすべての入力および出力ストリームをそのオプションとともに管理しており,これはStreams[]にリストとして書かれている.これを直接見てみると便利なことがある.しかし,このリストを直接変更することはできない.これはOpenRead等の関数によって変更される.

New to Mathematica? Find your learning path »
Have a question? Ask support »