ファイル入出力¶
ファイル入出力の方法について、artisoc4とartisoc Cloudの違いを解説します。
ファイル読み込み¶
以下のようなユースケースを想定して説明します。
以下のようなcsv形式のファイル
input.csv
の各行を順番に読み込み、2番目の要素を取得してコンソールにプリントする
input.csv
1, 2, 3, 4, 5
6, 7, 8, 9, 10
11, 12, 13, 14, 15
ここでは説明の都合上単にプリントしていますが、実際にはファイルから取得した数値を変数に格納するようなケースが考えられます。
artisoc4の場合¶
artisoc4では、たとえば以下のように記述します。
Dim line as String
Dim data as String
Dim value as Integer
OpenFile("input.csv", 1, 1)
Do While(IsEofFile(1) == False)
line = ReadFile(1)
data = GetToken(line, 2)
value = CInt(data)
PrintLn(value)
Loop
CloseFile(1)
変数定義の後、処理の1行目でOpenFile
関数を用いてファイルを読み込みます。2番目の引数はファイル識別のための番号で、何でもかまいませんが1を指定しています。3番目の引数はオープンモードで、ここでは読み込みなので1を指定します。ちなみに書き込みでは2、追記では3を指定します。
2行目ではIsEofFile
関数を用いてファイル終了を判定し、while文を用いて最終行までの繰り返し処理を行っています。
3行目ではReadFile
関数を用いて1行を読み込んでいます。たとえば最初の繰り返しでは、変数lineには1, 2, 3, 4, 5
というように最初の行のデータが入ります。次の繰り返しではその次の行のデータが入ります。
4行目ではGetToken
関数を用いてlineの2番目の要素を取得し変数dataに格納します。最初の繰り返しでは、変数dataには3
が入ります(要素番号は0番目から数えることに注意します)。また、ここで変数dataは文字列型であることに注意します。
5行目では、CInt
関数を用いて文字列型の変数dataを整数型に変換しています。(今回はコンソールに出力するだけのであまり意味がありませんが、数値データとして用いるならばこの処理が必要です)
6行目でコンソールにプリントします。2行目から6行目の処理をcsvファイルの各行に対して繰り返します。
最後にCloseFile
関数を用いてファイルを閉じます。
実行するとコンソールには以下のように出力されます。
3
8
13
artisoc Cloudの場合¶
まったく同じ処理を行う場合、artisoc Cloudではたとえば以下のように記述します。
import csv
with open("input.csv", mode="r") as f:
reader = csv.reader(f)
for line in reader:
data = line[2]
value = int(data)
print(data)
1行目でcsv
モジュールをインポートしています。これはcsvファイルを扱うのに便利な機能が入ったもので、このあと使用します。
2行目でwith open
を用いてファイルを読み込み、変数f
に格納しています。mode="r"
でオープンモードを読み込みに設定しています。このあとの処理はインデント内に記述することに注意します。
3行目でcsv
モジュールを用いて、reader
オブジェクトを作成しています。これはcsvファイルの各行を収めたデータであると考えてください。
4行目でfor
文を用い、csvファイルの各行を変数lineに収めて繰り返し処理を行います。
5行目でlineの2番目の要素を変数dataに格納しています。たとえば最初の繰り返しでは、lineはinput.csvの最初の行ですので[0, 1, 2, 3, 4, 5]
というリストになります。よって、dataには2
が入ります。ここでdataは文字列型であることに注意します。
6行目でint
関数を用いて文字列型の変数データを整数型に変換しています。
7行目でコンソールにプリントします。5~7行目の処理をcsvファイルの各行に対して繰り返します。
ファイル書き込み¶
以下のようなユースケースを想定して説明します。
毎ステップ終了時に、
output.csv
の1列目にステップ数を、2列目にUniverse変数hensuu
値を追記する
たとえば、5ステップ目まで実行した場合にはoutput.csv
は以下のようになります。
output.csv
"1","0.6824156034474742",
"2","0.48215025483320517",
"3","0.0464513240693708",
"4","0.8707409926140838",
"5","0.9415978124186635",
変数の値の変化を各ステップで記録するイメージです。(ここでは変数値は単なる乱数としています)
artisoc4の場合¶
artisoc4では、Univ_Step_Endに以下のように記述します。
OpenFileCSV("output.csv", 1, 3)
WriteFilecsv(1, GetCountStep(), False)
WriteFileCSV(1, Universe.hensuu, True)
CloseFilecsv(1)
1行目でOpenFileCSV
関数を用いてファイルを開きます。2番目の引数はファイル識別のための番号で、何でもかまいませんが1を指定しています。3番目の引数はオープンモードで、ここではファイルの末尾に追記していくため3を指定します。(ちなみに1は読み込み、2はファイル内のデータを破棄してから書き込みます)
2行目でWriteFileCSV
関数を用いてステップ数を書き込みます。3番目の引数は改行するかどうかで、ここではFalseを指定しているので、次にWriteFileCSV
が呼ばれたときは同じ行に書き込まれます。
3行目で変数の値を書き込みます。3番目の引数にTrueを指定しているので、次にWriteFileCSV
が呼ばれたときは次の行に書き込まれます。
4行目でファイルを閉じます。Univ_Step_Endに記述しているため、ここまでの処理が毎ステップ終了時に実行されます。
artisoc Cloudの場合¶
まったく同じ処理を行う場合、artisoc Cloudではuniv_step_endにたとえば以下のように記述します。
import csv
with open("output.csv", mode="a") as f:
writer = csv.writer(f)
data = [count_step(), Universe.hensuu]
writer.writerow(data)
1行目でcsv
モジュールをインポートしています。これはcsvファイルを扱うのに便利な機能が入ったもので、このあと使用します。
2行目でwith open
を用いてファイルを読み込み、変数f
に格納しています。mode="a"
でオープンモードを追記に設定しています(ちなみにmode="r"
で読み込み、mode="w"
でファイル内のデータを破棄してからの書き込みになります)。このあとの処理はインデント内に記述することに注意します。
3行目でcsv
モジュールを用いて、writer
オブジェクトを作成しています。これはcsvファイルに書き込むための道具を作ったものと考えてください。
4行目で書き込むためのデータをリスト形式で用意しています。0番目の要素にステップ数を、1番目の要素に変数を格納しています。
5行目でwriter
オブジェクトのwriterow
関数を用いてdataをファイルに書き込みます。これで、1列目にステップ数が、2列目に変数が追記されます。