Як читати файл за рядком у Джулії?


18

Як відкрити текстовий файл і прочитати його рядок за рядком? Є два різні випадки, які мені цікаві відповіді:

  1. Отримайте всі рядки в масиві одразу.
  2. Обробляйте кожен рядок по одному.

У другому випадку мені не хочеться зберігати всі рядки в пам’яті одночасно.

Відповіді:


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робить для вас, і рідко потрібно робити це самостійно, але якщо вам потрібно, ці можливості є. Для отримання додаткової інформації про читання символу файлу за символом див. Це запитання та відповідь: Як ми можемо використовувати Юлію для читання кожного символу .txt-файлу, по одному?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.