【问题标题】:How write datatype in file with julia如何使用 julia 在文件中写入数据类型
【发布时间】:2016-08-28 18:34:03
【问题描述】:

在 julia 中,我想在文件中写入一个变量和他的类型,以便以后重用它。像这样:

var = Float64(15)
stream = open("foo.dat", "w")
write(stream, typeof(var))
write(stream, var)
close(stream)

stream = open("foo.dat", "r")
typevar = read(stream, DataType)
var = read(stream, typevar)
close(stream)

第三行不行:

ERROR: LoadError: MethodError: `write` has no method matching write(::IOStream, ::Type{Float64})
Closest candidates are:
write(::IO, ::Any)

我该怎么做?谢谢你:)

【问题讨论】:

  • 您查看过 JLD 包吗?您可以使用它来存储完整的 Julia 对象,其中包括它们的类型。
  • 另外,根据您的需要,这甚至可能没有必要。例如,如果您只有一个 Float64 对象数组,那么您可以使用 writedlm 将其写入 .txt 文件,然后 readdlm 将其读回。readdlm 将采用可选的参数来指定读回数据时的类型。
  • 谢谢你迈克尔 :) 我看 JLD 和 HDF5 包。 writedlm 写文本,但我会写二进制。
  • 好吧,我不确定,但我不知道将文件类型写入规范二进制文件的方法 - 我怀疑可能没有办法,因为文件类型因语言而异,但我很容易出错。但是,作为一种解决方法,您可以在文件的开头写一个额外的数字或字符来表示文件类型,然后保留一个字典,将它们映射到文件类型。有点小技巧,但它可能会成功。
  • JLD 是正确的解决方案。你得到什么错误?

标签: julia


【解决方案1】:

由于似乎对您的文件格式没有任何严格的要求,因此使用 JLD 包是最好的方法,正如许多评论者在上面所说的那样。它将自动跟踪您存储在其中的所有内容的类型,因此您可以直接读取值。

您必须使用 Pkg.add("JLD") 安装该软件包。完成后,使用它很简单:

julia> using JLD
INFO: Precompiling module JLD...
INFO: Recompiling stale cache file /Users/aviks/.julia/lib/v0.4/FileIO.ji for module FileIO.

julia> a=10
10

julia> b="A String"
"A String"

julia> c=[1,2]
2-element Array{Int64,1}:
 1
 2

julia> file = jldopen("/tmp/mydata.jld", "w")
Julia data file version 0.1.1: /tmp/mydata.jld

julia> write(file, "a", a)

julia> write(file, "b", b)

julia> write(file, "c", c)

julia> close(file)

然后,当你想读取变量时,在新的 REPL 会话中

julia> using JLD

julia> d=load("/tmp/mydata.jld")
Dict{ByteString,Any} with 3 entries:
  "c" => [1,2]
  "b" => "A String"
  "a" => 10

julia> d["a"]
10

julia> d["b"]
"A String"

julia> d["c"]
2-element Array{Int64,1}:
 1
 2

有关 JLD 包的更多信息,请访问:https://github.com/JuliaIO/JLD.jl

【讨论】:

    【解决方案2】:

    我最好的方法:

    var = Float64(89)
    typevar = string(typeof(var), "\n")
    
    s = open("var.dat", "w")
    write(s, typevar, var) # Float64\n@V@
    close(s)
    
    s = open("var.dat", "r")
    typevar = chomp(readline(s)) # delete "\n"
    var = read(s, eval(parse(typevar)))
    close(s)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多