Как читать файл построчно в Юлии?

18

Как открыть текстовый файл и прочитать его построчно? Есть два разных случая, ответы на которые меня интересуют:

  1. Получить все строки в массиве одновременно.
  2. Обрабатывайте каждую строку по одной.

Во втором случае я не хочу хранить все строки в памяти одновременно.

StefanKarpinski
источник

Ответы:

25

Чтение файла в память сразу как массив строк - это просто вызов readlinesфункции:

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

По умолчанию это отбрасывает новые строки, но если вы хотите сохранить их, вы можете передать ключевое слово аргумент 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"

Если у вас есть уже открытый файловый объект, вы также можете передать его в 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"

Это демонстрирует readlineфункцию, которая читает одну строку из открытого объекта ввода-вывода или, когда ему присваивается имя файла, открывает файл и читает первую строку из него:

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

Если вы не хотите загружать содержимое файла сразу (или обрабатываете потоковые данные, например, из сетевого сокета), вы можете использовать eachlineфункцию, чтобы получить итератор, который выдает строки по одной за раз:

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

eachlineФункция может, например readlines, также может быть дан открытый дескриптор файла для чтения строки из. Вы также можете «свернуть свой» итератор, открыв файл и readlineнеоднократно вызывая :

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

Это эквивалентно тому, что eachlineделает для вас, и редко нужно делать это самостоятельно, но если вам нужно, способность есть. Для получения дополнительной информации о считывании файла символ за символом см. Этот вопрос и ответ: Как мы используем julia для чтения каждого символа файла .txt, по одному за раз?

StefanKarpinski
источник