Wie lese ich eine Datei Zeile für Zeile in Julia?

18

Wie öffne ich eine Textdatei und lese sie Zeile für Zeile? Es gibt zwei verschiedene Fälle, für die ich Antworten interessiere:

  1. Holen Sie sich alle Zeilen in einem Array auf einmal.
  2. Verarbeiten Sie jede Zeile einzeln.

Für den zweiten Fall möchte ich nicht alle Zeilen gleichzeitig im Speicher behalten müssen.

StefanKarpinski
quelle

Antworten:

25

Das gleichzeitige Einlesen einer Datei in den Speicher als Array von Zeilen ist nur ein Aufruf der readlinesFunktion:

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

Standardmäßig werden die Zeilenumbrüche verworfen. Wenn Sie sie jedoch beibehalten möchten, können Sie das Schlüsselwortargument übergeben 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"

Wenn Sie ein bereits geöffnetes Dateiobjekt haben, können Sie dies auch an die readlinesFunktion übergeben:

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"

Dies demonstriert die readlineFunktion, die eine einzelne Zeile aus einem geöffneten E / A-Objekt liest oder bei Angabe eines Dateinamens die Datei öffnet und die erste Zeile daraus liest:

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

Wenn Sie den Dateiinhalt nicht auf einmal laden möchten (oder wenn Sie Streaming-Daten wie von einem Netzwerk-Socket verarbeiten), können Sie die eachlineFunktion verwenden, um einen Iterator abzurufen, der nacheinander Zeilen erzeugt:

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

Der eachlineFunktion kann readlinesauch ein geöffnetes Dateihandle zum Lesen von Zeilen zugewiesen werden. Sie können auch Ihren eigenen Iterator "rollen", indem Sie die Datei öffnen und readlinewiederholt aufrufen :

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

Dies entspricht dem, was eachlinefür Sie getan wird, und es ist selten, dass Sie dies selbst tun müssen, aber wenn Sie müssen, ist die Fähigkeit vorhanden. Weitere Informationen zum zeichenweisen Lesen einer Datei finden Sie in dieser Frage und Antwort: Wie verwenden wir Julia, um jedes Zeichen einer TXT-Datei einzeln durchzulesen?

StefanKarpinski
quelle