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() 関数が呼び出されることです。次のようになります:
例
# ファイル操作を実行
end
上記のコードでは close() 関数を呼び出す必要はありません。自動的に close() 関数が呼び出されてファイルが閉じられるからです。
次に、test.jl ファイルを作成します。コードは次のとおりです:
test.jl ファイルのコード:
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 ファイルのコード:
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 语句
現在の行番号を取得することもできます:
例
# 行番号を設定
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)
例
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)
例
上記のコードを実行すると、出力結果は次のようになります:
["/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 のファイル名部分を取得します。 |