2016-07-28 57 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

相關問題