【问题标题】:Create new directory in Julia for each run在 Julia 中为每次运行创建新目录
【发布时间】:2020-12-29 17:58:02
【问题描述】:

我正在运行生成绘图和文本文件的 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/")

绘图后,我将图形保存到“绘图”:

fig_name = "test_figure"
savefig(fig_path*"/Output/Run_1/Plots/"*fig_name*".pdf")

输出文件(包含在“output_matrix”中)保存到“Data”:

outfile_1 = fig_path*"/Output/Run_1/Data/test_data.txt"
open(outfile_1, "w") do f1    
    writedlm(f1,output_matrix)    
end

但是,我想多次运行此代码。每次运行时,它都应该在“Output”文件夹中创建一个新的“Run”文件夹,即第一次运行它的 Run_1,第二次运行它的 Run_2,以此类推。以前运行的所有文件夹都不会被删除。在每个 Run 文件夹中,都有一个“Plots”和一个“Data”文件夹,我在每次运行时将绘图和数据保存到各自的文件夹中。如何让 Julia 以这种方式更新文件名?

【问题讨论】:

  • 顺便说一句,您可以使用joinpath 以更便携的方式构建路径
  • 另外,不要犹豫,看看DrWatson:这是一个专门用于帮助管理科学项目各个方面的 Julia 包。其中:naming simulations 为了始终如一地从模拟参数中导出路径(以确定性、可重复的方式)

标签: directory save julia saving-data


【解决方案1】:

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"

【讨论】:

    【解决方案2】:

    可能是这样的:

    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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多