web-dev-qa-db-fra.com

Comment lire un fichier ligne par ligne dans Julia?

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.

16
StefanKarpinski

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

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 de 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 fonction readlines:

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 illustre la fonction readline, 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 voulez 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 fonction eachline pour obtenir un itérateur qui produit les lignes une à la fois:

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

La fonction eachline peut, comme 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 readline à plusieurs 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 que eachline fait 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 utilisons-nous Julia pour lire chaque caractère d'un fichier .txt, un à la fois?

22
StefanKarpinski