2016-07-28 23 views
1

在茱莉亚,我想在文件中写入一个变量和他的类型以便稍后重用。就像这样:如何在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) 

我怎样才能做到这一点?谢谢:)

+4

你看过JLD包吗?您可以使用它来存储完整的Julia对象,其中将包括它们的类型。 –

+2

另外,取决于你想要什么,甚至可能没有必要。例如,如果你只是有一个说'Float64'对象的数组,那么你可以使用'writedlm'将其写入一个.txt文件,然后'readdlm'来读取它。'readdlm'将会选择一个可选的参数指定读取数据时的类型。 –

+0

谢谢迈克尔:)我看JLD和HDF5包。 writedlm写文本,但我会写二进制文件。 – pasto

回答

0

我的最好的方法:

var = Float64(89) 
typevar = string(typeof(var), "\n") 

s = open("var.dat", "w") 
write(s, typevar, var) # Float64\[email protected]@ 
close(s) 

s = open("var.dat", "r") 
typevar = chomp(readline(s)) # delete "\n" 
var = read(s, eval(parse(typevar))) 
close(s) 
2

因为似乎没有要你的文件的格式,任何强烈要求,使用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

相关问题