在 Julia 中为每个 运行 创建新目录
Create new directory in Julia for each run
我正在 运行ning Julia 代码生成绘图和文本文件。在相关代码所在的同一文件夹中存在一个“输出”文件夹。对于第一个 运行,我创建了一个“Run_1”文件夹,其中包含“Plots”和“Data”子文件夹:
fig_path = @__DIR__
mkdir(fig_path*"/Output/Run_1/")
mkdir(fig_path*"/Output/Run_1/Plots/")
mkdir(fig_path*"/Output/Run_1/Data/")
绘图后,我将图形保存到“Plots”:
fig_name = "test_figure"
savefig(fig_path*"/Output/Run_1/Plots/"*fig_name*".pdf")
并将输出文件(包含在“output_matrix”中)保存到“数据”:
outfile_1 = fig_path*"/Output/Run_1/Data/test_data.txt"
open(outfile_1, "w") do f1
writedlm(f1,output_matrix)
end
但是,我想 运行 多次使用此代码。每次它 运行s,它应该在“输出”文件夹中创建一个新的“运行”文件夹,即第一个 运行 它的 Run_1,第二个 运行 是 Run_2,依此类推。不会删除之前 运行 中的所有文件夹。在每个 运行 文件夹中,都有一个“Plots”和一个“Data”文件夹,我将绘图和数据保存到每个 运行 中各自的文件夹中。我怎样才能让 Julia 以这种方式更新文件名?
也许是这样的:
function mkresultdir(fig_path)
for i=1:1000
rundir = joinpath(fig_path, "run_$i")
if !isdir(rundir)
mkdir(rundir)
return rundir
end
end
error("too many results on disk, time for a cleanup!")
end
res_dir_1 = mkresultdir("/home/my_user/results")
res_dir_2 = mkresultdir("/home/my_user/results")
ispath
函数检查文件系统中是否存在文件或目录。
如果您想保留 Run_1
...Run_N
这样的命名约定,这样的事情可能会有所帮助:
function mk_output_dir()
i = 1
while true
dir_name = joinpath(@__DIR__, "Output", "run_$i")
if !ispath(dir_name)
mkpath(dir_name)
return dir_name
end
i += 1
end
end
这会产生:
# First run
julia> top_dir = mk_output_dir()
"/tmp/Output/run_1"
julia> mkdir(joinpath(top_dir, "Plots"))
"/tmp/Output/run_1/Plots"
julia> mkdir(joinpath(top_dir, "Data"))
"/tmp/Output/run_1/Data"
# Second run
julia> top_dir = mk_output_dir()
"/tmp/Output/run_2"
julia> mkdir(joinpath(top_dir, "Plots"))
"/tmp/Output/run_2/Plots"
julia> mkdir(joinpath(top_dir, "Data"))
"/tmp/Output/run_2/Data"
请注意,如果同时启动程序的两个实例,可能会出现竞争条件。
另外,在创建这样的目录结构时,我个人倾向于使用涉及时间戳的命名约定。这是一个最小的例子:
using Dates
function mk_output_dir()
timestamp = Dates.format(now(), "YYYYmmdd-HHMMSS")
dir_name = joinpath(@__DIR__, "Output", "run_$timestamp")
@assert !ispath(dir_name) "Somebody else already created the directory"
mkpath(dir_name)
return dir_name
end
产生这样的东西:
julia> top_dir = mk_output_dir()
"/tmp/Output/run_20201229-210835"
julia> mkdir(joinpath(top_dir, "Plots"))
"/tmp/Output/run_20201229-210835/Plots"
julia> mkdir(joinpath(top_dir, "Data"))
"/tmp/Output/run_20201229-210835/Data"
我正在 运行ning Julia 代码生成绘图和文本文件。在相关代码所在的同一文件夹中存在一个“输出”文件夹。对于第一个 运行,我创建了一个“Run_1”文件夹,其中包含“Plots”和“Data”子文件夹:
fig_path = @__DIR__
mkdir(fig_path*"/Output/Run_1/")
mkdir(fig_path*"/Output/Run_1/Plots/")
mkdir(fig_path*"/Output/Run_1/Data/")
绘图后,我将图形保存到“Plots”:
fig_name = "test_figure"
savefig(fig_path*"/Output/Run_1/Plots/"*fig_name*".pdf")
并将输出文件(包含在“output_matrix”中)保存到“数据”:
outfile_1 = fig_path*"/Output/Run_1/Data/test_data.txt"
open(outfile_1, "w") do f1
writedlm(f1,output_matrix)
end
但是,我想 运行 多次使用此代码。每次它 运行s,它应该在“输出”文件夹中创建一个新的“运行”文件夹,即第一个 运行 它的 Run_1,第二个 运行 是 Run_2,依此类推。不会删除之前 运行 中的所有文件夹。在每个 运行 文件夹中,都有一个“Plots”和一个“Data”文件夹,我将绘图和数据保存到每个 运行 中各自的文件夹中。我怎样才能让 Julia 以这种方式更新文件名?
也许是这样的:
function mkresultdir(fig_path)
for i=1:1000
rundir = joinpath(fig_path, "run_$i")
if !isdir(rundir)
mkdir(rundir)
return rundir
end
end
error("too many results on disk, time for a cleanup!")
end
res_dir_1 = mkresultdir("/home/my_user/results")
res_dir_2 = mkresultdir("/home/my_user/results")
ispath
函数检查文件系统中是否存在文件或目录。
如果您想保留 Run_1
...Run_N
这样的命名约定,这样的事情可能会有所帮助:
function mk_output_dir()
i = 1
while true
dir_name = joinpath(@__DIR__, "Output", "run_$i")
if !ispath(dir_name)
mkpath(dir_name)
return dir_name
end
i += 1
end
end
这会产生:
# First run
julia> top_dir = mk_output_dir()
"/tmp/Output/run_1"
julia> mkdir(joinpath(top_dir, "Plots"))
"/tmp/Output/run_1/Plots"
julia> mkdir(joinpath(top_dir, "Data"))
"/tmp/Output/run_1/Data"
# Second run
julia> top_dir = mk_output_dir()
"/tmp/Output/run_2"
julia> mkdir(joinpath(top_dir, "Plots"))
"/tmp/Output/run_2/Plots"
julia> mkdir(joinpath(top_dir, "Data"))
"/tmp/Output/run_2/Data"
请注意,如果同时启动程序的两个实例,可能会出现竞争条件。
另外,在创建这样的目录结构时,我个人倾向于使用涉及时间戳的命名约定。这是一个最小的例子:
using Dates
function mk_output_dir()
timestamp = Dates.format(now(), "YYYYmmdd-HHMMSS")
dir_name = joinpath(@__DIR__, "Output", "run_$timestamp")
@assert !ispath(dir_name) "Somebody else already created the directory"
mkpath(dir_name)
return dir_name
end
产生这样的东西:
julia> top_dir = mk_output_dir()
"/tmp/Output/run_20201229-210835"
julia> mkdir(joinpath(top_dir, "Plots"))
"/tmp/Output/run_20201229-210835/Plots"
julia> mkdir(joinpath(top_dir, "Data"))
"/tmp/Output/run_20201229-210835/Data"