Jak czytać plik linia po linii w Julii?

18

Jak otworzyć plik tekstowy i odczytać go wiersz po wierszu? Są dwa różne przypadki, dla których jestem zainteresowany odpowiedziami:

  1. Zbierz wszystkie wiersze z tablicy jednocześnie.
  2. Przetwarzaj każdą linię pojedynczo.

W drugim przypadku nie chcę mieć wszystkich linii jednocześnie.

Stefan Karpiński
źródło

Odpowiedzi:

25

Odczytywanie pliku do pamięci naraz jako tablica wierszy to tylko wywołanie do readlines funkcji:

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

Domyślnie usuwa to nowe wiersze, ale jeśli chcesz je zachować, możesz przekazać argument słowa kluczowego 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"

Jeśli masz już otwarty obiekt pliku, możesz również przekazać go do pliku readlines funkcji:

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"

To pokazuje readline funkcję, która odczytuje pojedynczy wiersz z otwartego obiektu I / O lub gdy otrzyma nazwę pliku, otwiera plik i odczytuje z niego pierwszy wiersz:

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

Jeśli nie chcesz ładować zawartości pliku jednocześnie (lub jeśli przetwarzasz dane przesyłane strumieniowo, jak z gniazda sieciowego), możesz użyć eachline funkcji, aby uzyskać iterator, który tworzy linie pojedynczo:

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

eachlineFunkcja, jak readlinesrównież mieć otwartą uchwyt pliku do odczytu linii od. Możesz także „rzucić własny” iterator, otwierając plik i readlinewielokrotnie wywołując :

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

Jest to równoważne z tym, co eachlinerobi dla ciebie i rzadko trzeba to robić samodzielnie, ale jeśli to konieczne, zdolność jest dostępna. Aby uzyskać więcej informacji o czytaniu pliku znak po znaku, zapoznaj się z tym pytaniem i odpowiedzią: Jak używamy Julii do czytania każdego znaku pliku .txt, pojedynczo?

Stefan Karpiński
źródło