ファイル I/O †(バイナリでない)テキストや数値の入出力について. ファイルの開閉 †基本的にこの2種類を使用している.
out = open("file.txt","w") println(out,"foobar") close(out)
open("file.txt","w") do out println(out,"foobar") end open, do〜endの場合は,closeは不要.ただし,スコープの関係でdo〜end内で定義した変数はその中でしか有効にならない. julia> open("file.txt","r") do f a = readline(f) end "foobar" julia> println(a) ERROR: UndefVarError: a not defined globalにすれば一応do〜end外でも使えるが,紛らわしいので読み取りをする場合は素直にopen〜closeの方が良いと思われる. julia> open("file.txt","r") do f global a = readline(f); # global変数に end julia> println(a) # do〜end外でも有効 foobar julia> f = open("file.txt","r"); julia> a = readline(f); julia> close(f) julia> println(a) foobar openの2つめの引数にあるのは読み(read),書き(write),追加(append)専用のファイルにする識別子で,"r","w","a"で指定する. 入力 †基本 †readline, readlinesをよく使う. readline(io::IO=stdin; keep::Bool=false) readline(filename::AbstractString; keep::Bool=false) openを使用し,IOStream型を引数にしたreadlineは,読む度に読み取り開始位置が移動するが, julia> f = open("file.txt","r"); julia> readline(f) # 1行目 "foobar" julia> readline(f) # 2行目 (ファイルの末尾) "" julia> readline("file.txt") # 1行目 "foobar" julia> readline("file.txt") # 次も1行目 "foobar"
f = open("file.txt","r") header = readline(f) # 1行目だけheaderへ body = readlines(f) # 残り全部 close(f) readline, readlines後の変換 †readlinesで読んだbodyには複数行の情報があるとし,例えば n行目(row)の,m〜l (column)を参照して数値に変換するには num = parse(Float64, body[n][m:l]) のようにする. strarray = split(body[n], r"\s+",keepempty=false) # bodyのn行目を空白区切りにして分割 numarray = parse.(Float64, strarray) # 文字列の配列を Float64 配列に
# 数値っぽいものがマッチする正規表現 regex = r"([+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?)" # readline(f)で読んだ行の中から数値を抜き出し,その1つをFloat64に変換する val = parse(Float64, match(regex, readline(f)).captures[1]) その他 †直接配列に落としこむ場合は,DelimitedFiles.readdlmでも良い. readdlm(source, delim::AbstractChar, T::Type, eol::AbstractChar; header=false, skipstart=0, skipblanks=true, use_mmap, quotes=true, dims, comments=false, comment_char='#') open〜closeは不要でファイル名を引数とする. using DelimtedFiles: readdlm # 3行飛ばして4行目から読み取り開始する場合は skipstart=3 dataorg = DelimitedFiles.readdlm(filename, skipstart=3)
出力 †基本 †標準出力もファイル出力も基本的には同じfunctionを使えばよく,print, println, Printf.@printfなど. julia> print("hoge") # 標準出力 hoge julia> print(stdout, "hoge") # 上と同じ hoge julia> open("file.txt","w") do out #ファイルに書く print(out,"hoge") end julia> readlines("file.txt") # readline"s"なので配列 1-element Array{String,1}: "hoge" 配列の出力 †配列の出力に書いた通り. open("file.txt","w") do out Base.print_array(out, hcat(x[:],y[:],z[:])) # x,y,zの3列にして掃き出し end |