write() では改行文字列を使用できないのに、writelines() では使用できるのはなぜですか?
アイデアは次のとおりです。単一の文字列を書きたい場合は、 でこれを行うことができますwrite()
。文字列のシーケンスがある場合は、 を使用してそれらすべてを書き込むことができますwritelines()
。
write(arg)
文字列を引数として期待し、それをファイルに書き込みます。文字列のリストを指定すると、例外が発生します (ちなみに、エラーを表示してください!)。
writelines(arg)
引数としてイテラブルを期待します (イテラブル オブジェクトは、最も一般的な意味でタプル、リスト、文字列、またはイテレータにすることができます)。イテレータに含まれる各項目は、文字列であることが期待されます。文字列のタプルはあなたが提供したものなので、うまくいきました。
文字列の性質は、両方の関数にとって重要ではありません。つまり、指定したものをファイルに書き込むだけです。興味深いのはwritelines()
、それ自体では改行文字を追加しないため、メソッド名が実際にはかなり混乱する可能性があることです。実際には、 と呼ばれる架空のメソッドのように動作しwrite_all_of_these_strings(sequence)
ます。
以下は、各文字列をそれぞれの行に保持しながら、文字列のリストをファイルに書き込む Python の慣用的な方法です。
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.write('\n'.join(lines))
これにより、ファイルが閉じられます。コンストラクト'\n'.join(lines)
は、リスト内の文字列を連結 (接続)lines
し、文字 '\n' を接着剤として使用します。+
演算子を使用するよりも効率的です。
lines
同じシーケンスから開始し、同じ出力で終了しますが、次を使用しwritelines()
ます。
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.writelines("%s\n" % l for l in lines)
これはジェネレータ式を利用し、改行で終わる文字列を動的に作成します。writelines()
この一連の文字列を繰り返し処理し、すべての項目を書き込みます。
編集:あなたが知っておくべきもう一つの点:
write()
が導入される前からreadlines()
存在していました。の対応物として後で導入されたので、 を介して読み取ったばかりのファイルの内容を簡単に書き込むことができます。writelines()
writelines()
readlines()
readlines()
outfile.writelines(infile.readlines())
writelines
本当に、これがこのように紛らわしい名前を持つ主な理由です。また、今日では、このメソッドをもう使用したくありません。データの書き込みを開始するreadlines()
前に、ファイル全体をマシンのメモリに読み取ります。writelines()
まず第一に、これは時間を無駄にする可能性があります。他の部分を読み取りながら、データの一部を書き始めてみませんか? しかし、最も重要なことは、このアプローチは非常にメモリを消費する可能性があることです。入力ファイルがマシンのメモリよりも大きい極端なシナリオでは、このアプローチは機能しません。この問題の解決策は、反復子のみを使用することです。実際の例:
with open('inputfile') as infile:
with open('outputfile') as outfile:
for line in infile:
outfile.write(line)
これにより、入力ファイルが 1 行ずつ読み取られます。1 行が読み取られるとすぐに、この行が出力ファイルに書き込まれます。概略的に言えば、メモリ内には常に 1 行しかありません (readlines/writelines アプローチの場合、ファイルの内容全体がメモリ内にあるのとは対照的です)。