1

私は Zed Shaw の「Learn Python The Hard Way」に取り組んでいます。私は演習 16 ( http://learnpythonthehardway.org/book/ex16.html ) に取り組んでおり、追加クレジット # 3 を計算する際に問題が発生しています。 script と Zed は、文字列、フォーマット、およびエスケープを使用して、それらを単一の target.write コマンドに単純化することを望んでいます。

6 つの target.write コマンドを含む元のスクリプトを次に示します...

from sys import argv

script, filename = argv

print "We're going to erase %r." % filename
print "If you don't want that, hit CTRL-C (^C)."
print "If you do want that, hit RETURN."

raw_input("?")

print "Opening the file..."
target = open(filename, 'w')

print "Truncating the file.  Goodbye!"
target.truncate()

print "Now I'm going to ask you for three lines."

line1 = raw_input("line 1: ")
line2 = raw_input("line 2: ")
line3 = raw_input("line 3: ")

print "I'm going to write these to the file."

target.write(line1)
target.write("\n")
target.write(line2)
target.write("\n")
target.write(line3)
target.write("\n")

print "And finally, we close it."
target.close()

最初に、このように target.write コマンドを要約してみました...

target.write (line1, line2, line3)

スクリプトを実行すると、次のようになります。TypeError: 関数は正確に 1 つの引数を取ります (3 つ指定)

それから私は試しました...

target.write "I love %r and %r and %r." % (line1, line2, line3)

SyntaxError:無効な構文が表示されます

私も試しました...

target.write (line1), (line2), (line3)

今回は、スクリプトはエラーなしで実行されましたが、スクリプトが書き込むことになっているファイル (text.txt) を開くと、最初の文字列 (line1) のみがファイルに書き込まれ、他の 2 つの文字列 ( line2) および (line3)。

最後に、私はこれを試しました...

target.write (line1, "\n", line2 "\n", line3, "\n")

しかし、再び SyntaxError: invalid syntax が発生しました

誰かがこれについて正しい方向に私を向けることができますか?

とても有難い。

エディ

4

10 に答える 10

3

あなたができる

target.write('\n'.join((line1,line2,line3))+'\n')

または、もう少し明確に書かれているかもしれません:

lines=(line1,line2,line3)
target.write( '\n'.join(lines) + '\n')

ただし、この場合、最後に改行を追加するためだけにまったく新しい文字列を作成するというオーバーヘッドを回避するために、実際には最後の改行を個別に書くことができます (そして、よりきれいに見えると思います)。

lines=(line1, line2, line3)
target.write('\n'.join(lines))
target.write('\n')

これはあなたの行を取り、それらをタプルとしてまとめ、join文字列オブジェクトのメソッドを使用してそれらを単一の文字列にします。

(文字列の書式設定とは対照的に) このアプローチの利点は、何行の "行" を書き込むかをアプリオリに知る必要がないことです。反復可能なオブジェクトは、上記の式のタプルの代わりに機能します。

于 2012-07-20T17:35:05.897 に答える
2

一般に、定義された一連のデータを使用した同じ操作の繰り返しで構成されるコードは、そのデータのコレクションを反復処理し、ループ内でその操作を実行するループに変換できます。したがって、これは:

target.write(line1)
target.write("\n")
target.write(line2)
target.write("\n")
target.write(line3)
target.write("\n")

になります:

data = (line1, "\n", line2, "\n", line3, "\n")
for datum in data:
    target.write(datum)

ずっといい!writeこれで、別のことをしたい場合 (たとえば、別のファイルに送信したり、別の方法を使用したり) する場合に変更するコードは 1 行だけです。これをさらに改善する方法を考えてみてください

ただし、別のオプションがあります。そのデータを連結する効果を持つ複数のデータに対する操作がある場合、代わりにデータを単一のデータに連結し、操作を 1 回実行できます (絶対的な初心者:操作がさらに多くのことを行う場合に注意してください)。それよりも、それらは完全に同等ではない可能性があります)。この場合、次のようになります。

data = (line1, "\n", line2, "\n", line3, "\n")
target.write(''.join(data))

ここで、 のドキュメントを見て、joinそれをさらに単純化する方法を見つけてください。(ヒント: ループを単純化するのと同じデータに関する事実を利用します)。

于 2012-07-20T18:04:50.037 に答える
2

write()は、パラメーターとして単一stringを必要とします。あなたは試すことができます

 target.write (line1 + '\n' + line2 +'\n' + line3)  # ugly!! - but works

より良いアプローチは、文字列を作成してから印刷することです。

 line = '{}\n{}\n{}\n'.format(line1, line2, line3)
 target.write(line)

または、文字列を で動的に結合するjoin()、およびこれに対処する他のいくつかの方法がありますが、これで開始する必要があります (そして問題の原因を説明します)。

于 2012-07-20T17:34:24.570 に答える
1

どうですか

target.write("%s\n%s\n%s\n" % (line1, line2, line3))
于 2012-07-20T17:36:09.100 に答える
1

文字列を書きます:

lines = "%s\n%s\n%s\n" % (line1, line2, line3)

target.write(行)

于 2014-03-03T05:40:14.310 に答える
0

やった

target.write("%s\n%s\n%s" % (line1, line2, line3 ))
于 2013-08-24T23:21:06.880 に答える
0
target.write('\n' .join((line1 , line2 , line3))+'\n')
于 2014-07-04T20:40:09.073 に答える
0

target.write(""" line1 \n line2 \n line3 \n""")

于 2015-02-06T03:46:16.397 に答える
0

これは私にとってはうまくいきました、試してみてください

lines = " %s \n %s \n %s  \n"  %  (line1, line2, line3)

target.write(lines)
于 2017-11-02T15:20:44.313 に答える
0
target.write(""" #{line1} \n #{line2} \n #{line3} \n""")

これは私のために働いた唯一のものです。

于 2016-10-26T10:55:00.130 に答える