Como ler um arquivo linha por linha em Julia?

18

Como abro um arquivo de texto e o leio linha por linha? Há dois casos diferentes nos quais estou interessado em respostas:

  1. Obtenha todas as linhas em uma matriz de uma vez.
  2. Processe cada linha uma de cada vez.

Para o segundo caso, não quero manter todas as linhas na memória ao mesmo tempo.

StefanKarpinski
fonte

Respostas:

25

Ler um arquivo na memória de uma só vez como uma matriz de linhas é apenas uma chamada para a readlinesfunção:

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

Por padrão, isso descarta as novas linhas, mas se você deseja mantê-las, pode passar o argumento da palavra-chave 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 você já possui um objeto de arquivo aberto, também pode passar para a readlinesfunção:

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"

Isso demonstra a readlinefunção, que lê uma única linha de um objeto de E / S aberto ou, quando recebe um nome de arquivo, abre o arquivo e lê a primeira linha a partir dele:

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

Se você não deseja carregar o conteúdo do arquivo de uma só vez (ou se estiver processando dados de streaming como de um soquete de rede), poderá usar a eachlinefunção para obter um iterador que produza linhas uma por vez:

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

A eachlinefunção readlinestambém pode receber um identificador de arquivo aberto para leitura de linhas. Você também pode "rolar o seu próprio" iterador, abrindo o arquivo e chamando 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

Isso é equivalente ao que eachlinefaz por você e é raro precisar fazer isso sozinho, mas se você precisar, a capacidade estará lá. Para obter mais informações sobre como ler um arquivo caractere por caractere, consulte esta pergunta e resposta: Como usamos julia para ler cada caractere de um arquivo .txt, um de cada vez?

StefanKarpinski
fonte