Julia Language
Inmatning
Sök…
Syntax
- readline ()
- readlines ()
- readstring (STDIN)
- chomp (str)
- öppen (f, fil)
- eachline (io)
- readstring (fil)
- Läs (fil)
- readcsv (fil)
- readdlm (fil)
parametrar
| Parameter | detaljer |
|---|---|
chomp(str) | Ta bort upp till en efterföljande ny linje från en sträng. |
str | Strängen för att remsa en släpande ny linje från. Observera att strängar är oföränderliga genom konvention. Denna funktion returnerar en ny sträng. |
open(f, file) | Öppna en fil, ring funktionen och stäng filen efteråt. |
f | Funktionen för att anropa IO-strömmen som öppnar filen genererar. |
file | Sökvägen för filen som ska öppnas. |
Läsa en sträng från standardinmatning
STDIN strömmen i Julia hänvisar till standardinmatning . Detta kan representera antingen användarinmatning, för interaktiva kommandoradsprogram, eller inmatning från en fil eller pipeline som har omdirigerats till programmet.
readline , när det inte anges några argument, kommer att läsa data från STDIN tills en ny linje uppstår, eller STDIN strömmen går in i slutet av filtillståndet. Dessa två fall kan särskiljas genom om tecknet \n har lästs som det sista tecknet:
julia> readline()
some stuff
"some stuff\n"
julia> readline() # Ctrl-D pressed to send EOF signal here
""
För interaktiva program bryr vi oss inte om EOF-tillståndet och vill bara ha en sträng. Vi kan till exempel be användaren om inmatning:
function askname()
print("Enter your name: ")
readline()
end
Detta är dock inte helt tillfredsställande på grund av den nya nylinjen:
julia> askname()
Enter your name: Julia
"Julia\n"
chomp är tillgänglig för att ta bort upp till en efterföljande ny linje från en sträng. Till exempel:
julia> chomp("Hello, World!")
"Hello, World!"
julia> chomp("Hello, World!\n")
"Hello, World!"
Vi kan därför förstärka vår funktion med chomp så att resultatet blir som förväntat:
function askname()
print("Enter your name: ")
chomp(readline())
end
vilket har ett mer önskvärt resultat:
julia> askname()
Enter your name: Julia
"Julia"
Ibland kanske vi vill läsa så många rader som möjligt (tills ingångsströmmen går in i slutet av filtillståndet). Funktionen readlines ger den möjligheten.
julia> readlines() # note Ctrl-D is pressed after the last line
A, B, C, D, E, F, G
H, I, J, K, LMNO, P
Q, R, S
T, U, V
W, X
Y, Z
6-element Array{String,1}:
"A, B, C, D, E, F, G\n"
"H, I, J, K, LMNO, P\n"
"Q, R, S\n"
"T, U, V\n"
"W, X\n"
"Y, Z\n"
Återigen kan vi använda chomp funktionen för att ta bort dem om vi inte gillar de nya linjerna i slutet av raderna lästa av readlines . Den här gången sänder vi chomp över hela matrisen:
julia> chomp.(readlines())
A, B, C, D, E, F, G
H, I, J, K, LMNO, P
Q, R, S
T, U, V
W, X
Y, Z
6-element Array{String,1}:
"A, B, C, D, E, F, G"
"H, I, J, K, LMNO, P"
"Q, R, S"
"T, U, V"
"W, X "
"Y, Z"
Andra gånger kanske vi inte bryr oss om linjer alls och vill bara läsa så mycket som möjligt som en enda sträng. readstring åstadkommer detta:
julia> readstring(STDIN)
If music be the food of love, play on,
Give me excess of it; that surfeiting,
The appetite may sicken, and so die. # [END OF INPUT]
"If music be the food of love, play on,\nGive me excess of it; that surfeiting,\nThe appetite may sicken, and so die.\n"
( # [END OF INPUT] är inte en del av den ursprungliga inmatningen; den har lagts till för tydlighetens skull.)
Observera att readstring måste passera STDIN argumentet.
Läser nummer från standardinmatning
Läsa siffror från standardinmatning är en kombination av lässträngar och analysera strängar som siffror.
parse används för att analysera en sträng till önskad nummertyp:
julia> parse(Int, "17")
17
julia> parse(Float32, "-3e6")
-3.0f6
Formatet som förväntas av parse(T, x) liknar, men inte exakt samma, som det format Julia förväntar sig från antalet bokstavliga :
julia> -00000023
-23
julia> parse(Int, "-00000023")
-23
julia> 0x23 |> Int
35
julia> parse(Int, "0x23")
35
julia> 1_000_000
1000000
julia> parse(Int, "1_000_000")
ERROR: ArgumentError: invalid base 10 digit '_' in "1_000_000"
in tryparse_internal(::Type{Int64}, ::String, ::Int64, ::Int64, ::Int64, ::Bool) at ./parse.jl:88
in parse(::Type{Int64}, ::String) at ./parse.jl:152
Genom att kombinera parse och readline funktionerna kan vi läsa ett enda nummer från en rad:
function asknumber()
print("Enter a number: ")
parse(Float64, readline())
end
som fungerar som förväntat:
julia> asknumber()
Enter a number: 78.3
78.3
De vanliga förbehållen om flytpunktsprecision gäller. Observera att parse kan användas med BigInt och BigFloat att ta bort eller minimera förlust av precision.
Ibland är det bra att läsa mer än ett nummer från samma rad. Vanligtvis kan linjen delas med blanksteg:
function askints()
print("Enter some integers, separated by spaces: ")
[parse(Int, x) for x in split(readline())]
end
som kan användas enligt följande:
julia> askints()
Enter some integers, separated by spaces: 1 2 3 4
4-element Array{Int64,1}:
1
2
3
4
Läsa data från en fil
Läser strängar eller byte
Filer kan öppnas för läsning med hjälp av den open funktionen, som ofta används tillsammans med do block-syntax :
open("myfile") do f
for (i, line) in enumerate(eachline(f))
print("Line $i: $line")
end
end
Anta att myfile finns och dess innehåll är
What's in a name? That which we call a rose
By any other name would smell as sweet.
Sedan skulle denna kod ge följande resultat:
Line 1: What's in a name? That which we call a rose
Line 2: By any other name would smell as sweet.
Observera att eachline är en lat iterable över filens rader. Det är att föredra att readlines av prestandaskäl.
Eftersom do blocket syntax är bara syntaktiskt socker för anonyma funktioner kan vi passerar namnges funktioner för att open också:
julia> open(readstring, "myfile")
"What's in a name? That which we call a rose\nBy any other name would smell as sweet.\n"
julia> open(read, "myfile")
84-element Array{UInt8,1}:
0x57
0x68
0x61
0x74
0x27
0x73
0x20
0x69
0x6e
0x20
⋮
0x73
0x20
0x73
0x77
0x65
0x65
0x74
0x2e
0x0a
Funktionerna read och readstring ger readstring som öppnar en fil automatiskt:
julia> readstring("myfile")
"What's in a name? That which we call a rose\nBy any other name would smell as sweet.\n"
Läser strukturerade data
Anta att vi hade en CSV-fil med följande innehåll, i en fil med namnet file.csv :
Make,Model,Price
Foo,2015A,8000
Foo,2015B,14000
Foo,2016A,10000
Foo,2016B,16000
Bar,2016Q,20000
Då kan vi använda readcsv funktionen för att läsa dessa data i en Matrix :
julia> readcsv("file.csv")
6×3 Array{Any,2}:
"Make" "Model" "Price"
"Foo" "2015A" 8000
"Foo" "2015B" 14000
"Foo" "2016A" 10000
"Foo" "2016B" 16000
"Bar" "2016Q" 20000
Om filen istället avgränsades med flikar, i en fil med namnet file.tsv , kan readdlm funktionen användas istället, med delim inställt på '\t' . Mer avancerade arbetsbelastningar bör använda CSV.jl- paketet .