Juliaでファイルを1行ずつ読み取る方法は?


18

テキストファイルを開いて1行ずつ読み取るにはどうすればよいですか?私が回答に興味を持っている2つの異なるケースがあります。

  1. 配列内のすべての行を一度に取得します。
  2. 一度に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開いているI / Oオブジェクトから1行を読み取るか、ファイル名を指定するとファイルを開いて最初の行を読み取る関数を示しています。

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

ファイルの内容を一度にロードしたくない場合(またはネットワークソケットからのようにストリーミングデータを処理している場合)、eachline関数を使用して、一度に1行ずつ生成するイテレータを取得できます。

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あなたのために行うことと同等であり、自分でこれを行う必要があることはまれですが、必要な場合はその能力があります。1文字ずつファイルを読み取る方法の詳細については、次の質問と回答を参照してください。juliaを使用して、.txtファイルの各文字を一度に1つずつ読み取るにはどうすればよいですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.