Bagaimana cara membaca file baris demi baris di Julia?

18

Bagaimana cara membuka file teks dan membacanya baris demi baris? Ada dua kasus berbeda yang saya tertarik pada jawaban untuk:

  1. Dapatkan semua baris dalam sebuah array sekaligus.
  2. Memproses setiap baris satu per satu.

Untuk kasus kedua saya tidak ingin harus menyimpan semua baris dalam memori sekaligus.

StefanKarpinski
sumber

Jawaban:

25

Membaca file ke memori sekaligus sebagai array baris hanyalah panggilan ke readlinesfungsi:

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

Secara default ini membuang baris baru tetapi jika Anda ingin mempertahankannya, Anda dapat melewati argumen kata kunci 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"

Jika Anda memiliki objek file yang sudah dibuka, Anda juga dapat meneruskannya ke readlinesfungsi:

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"

Ini menunjukkan readlinefungsi, yang membaca satu baris dari objek I / O terbuka, atau ketika diberi nama file, membuka file dan membaca baris pertama darinya:

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

Jika Anda tidak ingin memuat konten file sekaligus (atau jika Anda memproses data streaming seperti dari soket jaringan), maka Anda dapat menggunakan eachlinefungsi untuk mendapatkan iterator yang menghasilkan baris satu per satu:

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

The eachlineFungsi dapat, seperti readlines, juga diberi menangani file dibuka untuk membaca baris dari. Anda juga dapat "menggulung sendiri" iterator dengan membuka file dan menelepon readlineberulang kali:

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

Ini setara dengan apa yang eachlineAnda lakukan dan jarang perlu melakukannya sendiri, tetapi jika perlu, kemampuannya ada di sana. Untuk informasi lebih lanjut tentang membaca karakter file dengan karakter, lihat pertanyaan dan jawaban ini: Bagaimana kita menggunakan julia untuk membaca setiap karakter file .txt, satu per satu?

StefanKarpinski
sumber