Come leggere un file riga per riga in Julia?


18

Come faccio ad aprire un file di testo e leggerlo riga per riga? Esistono due casi diversi a cui sono interessato per le risposte:

  1. Ottieni tutte le linee in un array contemporaneamente.
  2. Elabora ogni riga una alla volta.

Per il secondo caso, non voglio dover tenere tutte le righe in memoria contemporaneamente.

Risposte:


25

Leggere un file in memoria tutto in una volta come un array di linee è solo una chiamata alla readlinesfunzione:

julia> words = readlines("/usr/share/dict/words")
235886-element Array{String,1}:
 "A"
 "a"
 "aa"
 
 "zythum"
 "Zyzomys"
 "Zyzzogeton"

Per impostazione predefinita, questo elimina le nuove righe ma se si desidera mantenerle, è possibile passare l'argomento della parola chiave keep=true:

julia> words = readlines("/usr/share/dict/words", keep=true)
235886-element Array{String,1}:
 "A\n"
 "a\n"
 "aa\n"
 
 "zythum\n"
 "Zyzomys\n"
 "Zyzzogeton\n"

Se hai già un oggetto file aperto, puoi anche passarlo alla readlinesfunzione:

julia> open("/usr/share/dict/words") do io
           readline(io) # throw out the first line
           readlines(io)
       end
235885-element Array{String,1}:
 "a"
 "aa"
 "aal"
 
 "zythum"
 "Zyzomys"
 "Zyzzogeton"

Ciò dimostra la readlinefunzione, che legge una singola riga da un oggetto I / O aperto, o quando viene assegnato un nome file, apre il file e legge la prima riga da esso:

julia> readline("/usr/share/dict/words")
"A"

Se non vuoi caricare tutti i contenuti del file contemporaneamente (o se stai elaborando dati di streaming come da un socket di rete), puoi utilizzare la eachlinefunzione per ottenere un iteratore che produce linee una alla volta:

julia> for word in eachline("/usr/share/dict/words")
           if length(word) >= 24
               println(word)
           end
       end
formaldehydesulphoxylate
pathologicopsychological
scientificophilosophical
tetraiodophenolphthalein
thyroparathyroidectomize

Alla eachlinefunzione può readlinesanche essere assegnato un handle di file aperto da cui leggere le righe. Puoi anche "ruotare il tuo" iteratore aprendo il file e chiamando readlineripetutamente:

julia> open("/usr/share/dict/words") do io
           while !eof(io)
               word = readline(io)
               if length(word) >= 24
                   println(word)
               end
           end
       end
formaldehydesulphoxylate
pathologicopsychological
scientificophilosophical
tetraiodophenolphthalein
thyroparathyroidectomize

Ciò equivale a quello che eachlinefa per te ed è raro doverlo fare da soli, ma se è necessario, l'abilità è lì. Per ulteriori informazioni sulla lettura di un carattere carattere per carattere, vedere questa domanda e risposta: Come possiamo usare julia per leggere ogni carattere di un file .txt, uno alla volta?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.