テキストファイルを開いて1行ずつ読み取るにはどうすればよいですか?私が回答に興味を持っている2つの異なるケースがあります。
- 配列内のすべての行を一度に取得します。
- 一度に1行ずつ処理します。
2番目のケースでは、すべての行を一度にメモリに保持する必要はありません。
テキストファイルを開いて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"
これは、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つずつ読み取るにはどうすればよいですか?