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()
この一連の文字列を反復処理し、すべてのアイテムを書き込みます。
編集:注意すべきもう1つのポイント:
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アプローチの場合、ファイルコンテンツ全体がメモリ内にあるのと比較して)。
lines
あなたの例では文字列ではありません。6つの文字列からなるタプルです。