テキストファイルを開いて1行ずつ読み取るにはどうすればよいですか?私が回答に興味を持っている2つの異なるケースがあります。
2番目のケースでは、一度にすべての行をメモリに保持する必要はありません。
行の配列としてファイルを一度にメモリに読み込むことは、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"
これは、開いているI/Oオブジェクトから1行を読み取るreadline
関数を示しています。または、ファイル名を指定すると、ファイルを開いて最初の行を読み取ります。
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つずつ読み取る方法