Julia ファイル(File)読み書き

Julia はファイルを処理するための基本的な関数をいくつか提供しています:

  • open()- ファイルを開く
  • read()- ファイルの内容を読み取る
  • close()- ファイルを閉じる

ファイルからデータを読み取る、またはファイルに書き込むには、ファイルハンドルを使用する必要があります。

ファイルハンドルは実際にはポインタであり、ポインタはファイル内の特定の位置を指すものです。

ファイルからデータを読み取る場合、アプリケーションはまずオペレーティングシステムの関数を呼び出してファイル名を渡し、そのファイルへのパスを選択してファイルを開きます。ファイルを開く関数はシーケンス番号、つまりファイルハンドル(file handle)を返します。このファイルハンドルは、開かれたファイルを一意に識別するための基準となります。

open() 関数

Julia は、次の関数を使用できます:open()関数でファイルを開くと、その関数はファイルハンドルを返します:

構文形式:

open(filename, mode)

filenameはファイル名、modeは読み書きモードで、次の値を使用できます:

mode(モード) 説明 キーワード
r read none
w 書き込み、作成、切り詰め write = true
a 書き込み、作成、追記 append = true
r+ 読み取り、書き込み read = true, write = true
w+ 読み取り、書き込み、作成、切り詰め truncate = true, read = true
a+ 読み取り、書き込み、作成、書き込み、作成、追記 append = true, read = true
# Windows 打开文件
foo = open("D://サンプル-test//julia//サンプル-file.txt")

# Linux 或 Mac 打开文件 
foo = open("./サンプル-test/julia/サンプル-file.txt")

close() 関数

ファイルの操作が完了したら、ファイルを閉じる操作を行う必要があります。そうしないとリソースリークなどの問題が発生します。ファイルを閉じるにはclose()関数:

# 关闭上面代码中打开文件返回的 foo 句柄
close(foo)

Julia では、任意のファイル処理関数をdoステートメントブロック内にラップすることをお勧めします。ファイル処理関数を do ステートメントブロック内にラップする利点は、そのブロックの実行が完了すると、開いたファイルが自動的に閉じられ、つまり自動的に close() 関数が呼び出されることです。次のようになります:

例

open("./サンプル-test/julia/サンプル-file.txt") do file
   # ファイル操作を実行
end

上記のコードでは close() 関数を呼び出す必要はありません。自動的に close() 関数が呼び出されてファイルが閉じられるからです。

次に、test.jl ファイルを作成します。コードは次のとおりです:

test.jl ファイルのコード:

# ファイルを開く。ファイルが存在しない場合は サンプル-file.txt を作成する
io = open("サンプル-file.txt", "w");

# ファイルの内容を書き込む
write(io, "Hello world!\nサンプル Julia Test");

# ファイルを閉じる
close(io);

上記のコードを実行:

$ julia test.jl

実行に成功すると、現在のコードファイルのディレクトリに サンプル-file.txt ファイルが作成され、次の内容が書き込まれます:

Hello world!
サンプル Julia Test

私たちは dodoステートメントを使用すれば、close()close()関数を使用する必要はありません:

test.jl ファイルのコード:

open("サンプル-file.txt", "w") do io
    write(io, "Hello world!\nサンプル Julia Test\ndo ステートメントを使用)
end;

上記のコードを実行:

$ julia test.jl

実行に成功すると、現在のコードファイルのディレクトリに サンプル-file.txt ファイルが作成され、次の内容が書き込まれます:

Hello world!
サンプル Julia Test
使用 do 语句

例

# ファイルの内容を読み取る
txt = open("サンプル-file.txt") do file
    read(file, String)
end;
# 出力
println(txt)

read() 関数

read() 関数を使用すると、ファイルの全内容を読み取ることができます。例:

txt = read(foo, String)

例

# ファイルを開く
file = open("サンプル-file.txt")

# ファイルの内容を読み取る
txt = read(file, String)

# ファイルを閉じる
close(file)

# 出力
println(txt)

上記のコードを実行すると、出力結果は次のようになります:

$ Julia test.jl
Hello world!
サンプル Julia Test

doステートメント内で使用するread()関数:

open(filename) do file
    read(file, String)
end

例

# ファイルの内容を読み取る
txt = open("サンプル-file.txt") do file
    read(file, String)
end;
# 出力
println(txt)

上記のコードを実行すると、出力結果は次のようになります:

$ julia test.jl
Hello world!
サンプル Julia Test

私たちは次の関数を使用できますreadlines()この関数でファイルの内容を行ごとに配列に格納します。構文は次のとおりです:

readlines(io::IO=stdin; keep::Bool=false)
readlines(filename::AbstractString; keep::Bool=false)

例

# ファイルを開く
file = open("サンプル-file.txt")

# ファイルの内容を読み取る
txt=readlines(file, keep=true)

# ファイルを閉じる
close(file)

# 出力
println(txt)

上記のコードを実行すると、出力結果は次のようになります:

$ julia test.jl
["Hello world!\n", "サンプル Julia Test\n", "使用 do 语句"]

私たちは次の関数を使用することもできますeachline()この関数でファイルを1行ごとに処理します:

例

# ファイルを開く
open("サンプル-file.txt") do file
# ファイルの内容を1行ずつ読み取る
    for ln in eachline(file)
        # 文字列の長さと文字列を出力
        println("$(length(ln)), $(ln)")
    end
end

上記のコードを実行すると、出力結果は次のようになります:

$ julia test.jl
12, Hello world!
17, サンプル Julia Test
8, 使用 do 语句

現在の行番号を取得することもできます:

例

open("サンプル-file.txt") do f
    # 行番号を設定
    line = 1
    while !eof(f)
       x = readline(f)
       println("$line $x")
       # 行ごとにインクリメント
       line += 1
    end
 end

上記のコードを実行すると、出力結果は次のようになります:

$ julia test.jl
1 Hello world!
2 サンプル Julia Test
3 使用 do 语句

stat() 関数

stat() この関数はファイルの情報を取得するために使用します。書式は次のとおりです:

stat(pathname) 

例

for n in fieldnames(typeof(stat("サンプル-file.txt")))
    println(n, ": ", getfield(stat("サンプル-file.txt"),n))
end

上記のコードを実行すると、出力結果は次のようになります:

$ julia test.jl
desc: サンプル-file.txt
device: 16777222
inode: 35345094
mode: 33188
nlink: 1
uid: 501
gid: 20
rdev: 0
size: 47
blksize: 4096
blocks: 8
mtime: 1.6524042534674733e9
ctime: 1.6524042534674733e9

abspath() 関数

abspath() この関数はファイルの絶対パスを取得するために使用します。リストにマッピングできます:

stat(pathname) 

例

println(map(abspath, readdir()))

上記のコードを実行すると、出力結果は次のようになります:

["/Users/サンプル/サンプル-test/.Rhistory", "/Users/サンプル/サンプル-test/.vscode", 
...

その他の関数

次の表に、ファイルを処理するためのその他の関連関数を示します:

番号 関数と説明
1

cd(path)

現在のディレクトリを切り替える

2

pwd()

現在のディレクトリを取得する

3

readdir(path)

現在のディレクトリ内のファイルとディレクトリのリストを返す。

4

abspath(path)

現在のディレクトリのファイル名を絶対パスに生成する。

5

joinpath(str, str, ...)

引数からパス名を組み立てる。

6

isdir(path)

指定されたパス引数 path がディレクトリであるかどうかを判定する。

7

splitdir(path)

パスをディレクトリ名とファイル名のタプルに分割する。

8

splitdrive(path)

Windows では、パスをドライブ文字部分とパス部分に分割します。Unix システムでは、最初のコンポーネントは常に空文字列です。

9

splitext(path)

パスの最後のコンポーネントにドットが含まれる場合、パスをドットより前のすべての内容と、ドットおよびドットより後のすべての内容に分割します。それ以外の場合は、変更されていない引数と空文字列のタプルを返します。

10

expanduser(path)

パス先頭のチルダ ~ を、現在のユーザーのホームディレクトリに置き換えます。

11

normpath(path)

パスを正規化し、"." と ".." ディレクトリを削除します。

12

realpath(path)

シンボリックリンクを辿ってパスを正規化し、"." と ".." ディレクトリを削除します。

13

homedir()

現在のユーザーのホームディレクトリを取得します。

14

dirname(path)

パス引数 path のディレクトリ部分を取得します。

15

basename(path)

パス引数 path のファイル名部分を取得します。

その他の拡張