Comment lire un fichier ligne par ligne dans Julia?

18

Comment ouvrir un fichier texte et le lire ligne par ligne? Il y a deux cas différents pour lesquels je souhaite des réponses:

  1. Obtenez toutes les lignes d'un tableau à la fois.
  2. Traitez chaque ligne une par une.

Pour le deuxième cas, je ne veux pas avoir à garder toutes les lignes en mémoire en même temps.

StefanKarpinski
la source

Réponses:

25

La lecture d'un fichier en mémoire d'un coup comme un tableau de lignes n'est qu'un appel à la readlinesfonction:

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

Par défaut, cela supprime les sauts de ligne, mais si vous souhaitez les conserver, vous pouvez passer l'argument mot-clé 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 vous avez un objet fichier déjà ouvert, vous pouvez également le transmettre à la readlinesfonction:

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"

Cela montre la readlinefonction, qui lit une seule ligne à partir d'un objet d'E / S ouvert, ou quand on lui donne un nom de fichier, ouvre le fichier et lit la première ligne de celui-ci:

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

Si vous ne souhaitez pas charger le contenu du fichier en une seule fois (ou si vous traitez des données en streaming comme à partir d'une prise réseau), vous pouvez utiliser la eachlinefonction pour obtenir un itérateur qui produit des lignes une par une:

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

La eachlinefonction peut readlineségalement recevoir un descripteur de fichier ouvert à partir duquel lire les lignes. Vous pouvez également "rouler votre propre" itérateur en ouvrant le fichier et en appelant à readlineplusieurs reprises:

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

Cela équivaut à ce qui eachlinefait pour vous et il est rare de devoir le faire vous-même, mais si vous en avez besoin, la capacité est là. Pour plus d'informations sur la lecture d'un fichier caractère par caractère, consultez cette question et réponse: Comment utiliser julia pour lire chaque caractère d'un fichier .txt, un à la fois?

StefanKarpinski
la source