Julia早引きノート［20］ファイル入出力

###ファイル入出力 (書き方例)

```ruby:note20

◆ファイルを一行ずつ読込んで文字列の配列を取得する
　f = open("inputfile.txt", "r")
  list = readlines(f)
　close(f)


◆モード
　r:読込み / w:書込み / a:追記
　r+:読込みと書込み / w+:読込みと書込み / a+:読込みと追記


◆読込み関数の例
　# ファイルを一行ずつ読み込み、文字列の配列を返す
　list = readlines(f)

　# ファイル全体を一つの文字列として読み込む
　data = read(f, String)  # String:読込むデータの型を指定

　# ループしてファイルを一行ずつ読み込む
　for line in eachline(f)
　    println(line)
　end


◆自動的にcloseする使い方
　open("inputfile.txt", "r") do f
　    処理...
　end


◆ファイル以外の入力
　・標準入力(stdin)
　　　　# コマンドプロンプトでの実行例
　　　　println("What is your name?")
　　　　input = readline(stdin)
　　　　println("your name is '", input, "'.")
　・標準出力(stdout)
　・標準エラー出力(stderr)


◆シリアライズ、デシリアライズ
　# モジュールのロード
　using Serialization
　# 対象データを定義(辞書型オブジェクトを作成)
　data = Dict()
　data["name"] = "Donald"
　data["company"] = "ABCD Co.,LTD."
　# シリアライズ実行
　serialize("seria_test.dat", data)
　# デシリアライズ実行
　a = deserialize("seria_test.dat")
　println(a["name"])
　println(a["company"])


◆JLD2形式
　# 保存データを作成(list)
　f = open("inputfile.txt", "r")
　list = readlines(f)
　close(f)
　# モジュールのロード
　using JLD2, FileIO
　# データの保存
　save("jld2_data.jld2", "data", list)
　# データの読取
　load("jld2_data.jld2")

```

##解説

・Juliaでファイルを開く処理は**open関数**を使います。
・openで開いた場合、最後にclose関数で閉じます。
・open関数を呼び出した後に、自動的にcloseするような使い方ができます。
・ファイルを開く際にmodeを指定します[**r**,**w**,**a**,**r+**,**w+**,**a+**]。
・ファイルの内容を読み込むための様々な関数が使用できます。
・ファイル以外にも標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)があります。
・**シリアライズ**、**デシリアライズ**でデータをバイトストリームに変換し保存、復元することができます。
・**JLD2形式**(大規模な階層データ)を使用できます。

####①open関数の例

open関数は以下のように使用します。
　` open(file名, mode) `
読み取りの際のmodeには以下があります。

　　**r**：読込みモード
　　**w**：書込みモード(ファイルが存在する場合は上書き)
　　**a**：追記モード
　　**r+**：読込みと書込みどちらも可能なモード(ファイルが存在しない場合はエラー)
　　**w+**：読込みと書込みどちらも可能なモード(ファイルが存在しない場合は新規作成)
　　**a+**：読込みと追記のどちらも可能なモード
　　※モード指定しない場合、デフォルトでは"r"(読込みモード)となります。

以下ではファイル「inputfile.txt」を開き、ファイルを一行ずつ読込んで文字列の配列を取得し、表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/b5abdf8d-f523-899e-6fbf-53d1d7928bdb.png)

####②読込み関数の例

以下のようなファイルの内容を読み込むための関数が使用できます。

　　**readlines**
　　　ファイルを一行ずつ読み込み、文字列の配列を返す
　　**read**
　　　ファイル全体を一つの文字列として読み込む
　　**eachline**
　　　ループしてファイルを一行ずつ読み込む
　　　` for line in eachline(f) `

読込み例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/20630f4e-e042-9525-7fe1-bbde33cd6a43.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/e39e9b76-74db-a725-5430-8ffc141196e5.png)
**※ファイルの読込み関数はこれ以外にもたくさんありますので、公式ドキュメントをご参照下さい。**

####③自動的にcloseする使い方

以下のような構文を使用します。

```ruby:note20
open(ファイル名) do f
    処理
end
```

実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/ad42f49f-a0ea-f980-19ea-85b51089458c.png)


####④ファイル以外の入力(標準入力、標準出力、標準エラー出力)

ファイルの入力以外に以下のようなものが使用できます。

　標準入力(stdin)
　標準出力(stdout)
　標準エラー出力(stderr)

例えば、以下のプログラムを実行するとコマンドプロンプトに入力した値をプログラムで取得することができます。

```ruby:ask_name.jl
println("What is your name?")
input = readline(stdin)
println("your name is '", input, "'.")
```

実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/cbb83227-019b-5cf5-d0b6-1dec0508bccb.png)

####⑤シリアライズ、デシリアライズ

オブジェクトをバイトストリームに変換する処理をシリアライズ、シリアライズされたバイトストリームを復元する処理をデシリアライズと言います。
Pythonのpickle変換処理と同じような処理です。

シリアライズ処理を行う際には、` using Serialization `でモジュールをロードします。
シリアライズを行う構文は以下のようになります。
　` serialize(ストリームIO, オブジェクト名) `
　` serialize(ファイル名, オブジェクト名) `

ただし、シリアライズ処理において、Juliaのバージョンが異なる環境で実行した場合などでは、元データの復元が保証されないことがあります。

実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/62613984-e690-f110-d7e4-991910d91bdd.png)

####⑥JLD2形式

JLD2はHDF5(hierarchical data format5)形式のフォーマットのサブセットで、大規模な階層データを保存することができます。

以下の手順でJLD2をインストールします。
　①対話モード画面で"]"キーを入力しパッケージモードにします。
　②JLD2とFileIOパッケージをインストールします。
　　` add JLD2 FileIO `
　③Backspaceキーでパッケージモードを解除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/733f5acd-e114-6ed3-fe94-f3617dd625e8.png)

実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/7ecd7a34-012a-a638-cc8e-a44edc1bfa6d.png)


JLD2は保存するデータに名前をつけて実行します。また、指定した名前のデータのみを復元することもできます。
複数データを保存する場合は、辞書型で複数データをまとめてから、この辞書データを保存します。

**※JLD2はこれ以外にもたくさんありますので、公式ドキュメントをご参照下さい。**


##もくじ
[Julia早引きノート［01］変数・定数の使い方](https://qiita.com/ttabata/items/a1ada2c0cba03672e105)
[Julia早引きノート［02］算術式、演算子](https://qiita.com/ttabata/items/90900d0914fa317f652d)
[Julia早引きノート［03］複素数]
(https://qiita.com/ttabata/items/225c77a4d71fafc3e482)
[Julia早引きノート［04］正規表現](https://qiita.com/ttabata/items/8b6e4a2b7c2ca299de03)
....
<details><summary>もくじを開く</summary><div>
[Julia早引きノート［05］if文]
(https://qiita.com/ttabata/items/4f0bcff1e32f60402dfb)
[Julia早引きノート［06］ループ処理]
(https://qiita.com/ttabata/items/2a53825101b0b75fb589)
[Julia早引きノート［07］try, catch, finally]
(https://qiita.com/ttabata/items/1d6fe990526c99b65b5f)
[Julia早引きノート［08］変数の型(Int, Float, Bool, Char, String)]
(https://qiita.com/ttabata/items/2b84a826e39bfe432b62)
[Julia早引きノート［09］関数 (1)基本編]
(https://qiita.com/ttabata/items/d9b4f2728ec0dbcc6394)
[Julia早引きノート［10］関数 (2)応用編]
(https://qiita.com/ttabata/items/462e216c43d519f1969d)
[Julia早引きノート［11］Nothing型]
(https://qiita.com/ttabata/items/0e5a6b21968d8752cf0b)
[Julia早引きノート［12］複合型(Composite Type)型]
(https://qiita.com/ttabata/items/27469216a3c33101c825)
[Julia早引きノート［13］タプル]
(https://qiita.com/ttabata/items/ebe35dbfec4efbc1c29a)
[Julia早引きノート［14］リスト(Array型一次元配列)]
(https://qiita.com/ttabata/items/7528863ccbb282e8260d)
[Julia早引きノート［15］辞書(dictionary)]
(https://qiita.com/ttabata/items/77a4f1d02b51d067bfb7)
[Julia早引きノート［16］集合]
(https://qiita.com/ttabata/items/ca8137922a785122037e)
[Julia早引きノート［17］多次元配列 (1)初期化]
(https://qiita.com/ttabata/items/01fecbd14363460a27a6)
[Julia早引きノート［18］多次元配列 (2)様々な演算や関数]
(https://qiita.com/ttabata/items/f35896a5fa005fba7fbc)
[Julia早引きノート［19］多次元配列 (3)サブ配列]
(https://qiita.com/ttabata/items/045c00406fe45270b42e)
[Julia早引きノート［20］ファイル入出力]
(https://qiita.com/ttabata/items/5a99c3998060d161ace8)
[Julia早引きノート［21］JSON、XMLファイルの入出力]
(https://qiita.com/ttabata/items/65ebec11830271f9be71)
[Julia早引きノート［22］Python関数やPythonモジュールの呼び出し]
(https://qiita.com/ttabata/items/3afc8cef40d1e98a7b17)
[Julia早引きノート［23］JuliaでのMatplotlibによるグラフ描画]
(https://qiita.com/ttabata/items/96a0e172addfac690cca)
[Julia早引きノート［24］CSVFiles(DataFrameとの連携)]
(https://qiita.com/ttabata/items/51446731a703b5aca524)
[Julia早引きノート［25］線形代数演算(ベクトル・行列計算)]
(https://qiita.com/ttabata/items/5abe14d5c510e8ca0f54)
(※引き続きコンテンツを増やしていきます)
</div></details>

##関連情報

:paperclip: Julia - 公式ページ
https://julialang.org/

:paperclip: Julia - 日本語公式ドキュメント
https://julia-doc-ja.readthedocs.io/ja/latest/index.html

:paperclip: 初めてのJuliaとインストール (Windows & Linux)
https://qiita.com/ttlabo/items/b05bb43d06239f968035

:paperclip: Julia - Mathematics
https://docs.julialang.org/en/v1/base/math/


##ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。