¿Cómo leer un archivo línea por línea en Julia?

18

¿Cómo abro un archivo de texto y lo leo línea por línea? Hay dos casos diferentes para los que estoy interesado en respuestas:

  1. Obtenga todas las líneas en una matriz a la vez.
  2. Procese cada línea una a la vez.

Para el segundo caso, no quiero tener que mantener todas las líneas en la memoria al mismo tiempo.

StefanKarpinski
fuente

Respuestas:

25

Leer un archivo en la memoria de una vez como un conjunto de líneas es solo una llamada a la readlinesfunción:

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

De forma predeterminada, esto descarta las nuevas líneas, pero si desea conservarlas, puede pasar el argumento de la palabra clave 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"

Si tiene un objeto de archivo ya abierto, también puede pasarlo a la readlinesfunción:

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"

Esto demuestra la readlinefunción, que lee una sola línea de un objeto de E / S abierto, o cuando se le da un nombre de archivo, abre el archivo y lee la primera línea de él:

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

Si no desea cargar el contenido del archivo de una vez (o si está procesando datos de transmisión como desde un socket de red), puede usar la eachlinefunción para obtener un iterador que produzca líneas de una en una:

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

La eachlinefunción readlinestambién puede recibir un identificador de archivo abierto para leer líneas. También puede "rodar su propio" iterador abriendo el archivo y llamando readlinerepetidamente:

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

Esto es equivalente a lo que eachlinehace por usted y es raro que necesite hacerlo usted mismo, pero si lo necesita, la habilidad está ahí. Para obtener más información sobre cómo leer un archivo carácter por carácter, consulte esta pregunta y respuesta: ¿Cómo usamos julia para leer cada carácter de un archivo .txt, uno a la vez?

StefanKarpinski
fuente