Как читать файл построчно в Юлии? - PullRequest
16 голосов
/ 30 сентября 2019

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

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

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

1 Ответ

22 голосов
/ 30 сентября 2019

Считывание файла в память одновременно в виде массива строк - это просто вызов функции 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, по одному?

...