150

だから私はPythonを学んでいます。私はレッスンを進めており、各ユーザー入力変数(のオブジェクト)の間に非常に多くtarget.write()のものを単一の に凝縮しなければならないという問題に遭遇しました。write()"\n"write()

私が思いついた:

nl = "\n"
lines = line1, nl, line2, nl, line3, nl
textdoc.writelines(lines)

私がやろうとすると:

textdoc.write(lines)

エラーが発生します。しかし、私が入力した場合:

textdoc.write(line1 + "\n" + line2 + ....)

その後、正常に動作します。では改行文字列を使用できないのに、では使用できるのはなぜwrite()ですかwritelines()?

パイソン 2.7

4

5 に答える 5

179
  • writelines文字列の iterable を期待します
  • write単一の文字列が必要です。

line1 + "\n" + line2に渡す前に、これらの文字列を 1 つの文字列にマージしwriteます。

行数が多い場合は、 を使用することをお勧めします"\n".join(list_of_lines)

于 2012-09-11T20:36:47.800 に答える
145

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 アプローチの場合、ファイルの内容全体がメモリ内にあるのとは対照的です)。

于 2012-09-11T20:40:17.223 に答える
-6

リストを保存してロードするだけの場合は、Pickleを試してください

ピクルスの節約:

with open("yourFile","wb")as file:
 pickle.dump(YourList,file)

と読み込み:

with open("yourFile","rb")as file:
 YourList=pickle.load(file)
于 2015-03-11T15:29:39.603 に答える
-6

実際、問題は変数「行」が悪いことだと思います。行をタプルとして定義しましたが、 write() には文字列が必要だと思います。コンマをプラス (+) に変更するだけです。

nl = "\n"
lines = line1+nl+line2+nl+line3+nl
textdoc.writelines(lines)

動作するはずです。

于 2013-09-17T22:18:44.003 に答える
-6

Zed Shaw の本から演習 16 を出しますか? 次のようにエスケープ文字を使用できます。

paragraph1 = "%s \n %s \n %s \n" % (line1, line2, line3)
target.write(paragraph1)
target.close()
于 2017-02-06T07:30:12.983 に答える