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

Å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 .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow