Zed Shaw の「Learn Python The Hard Way」を読んでいます。私は演習 17 ( http://learnpythonthehardway.org/book/ex17.html ) まで行っており、余分なクレジット # の 2 と 3 で壁にぶつかっています。必要です (彼は、スクリプトの 1 行だけで実行できると主張しています)。
これが元のスクリプトです...
from sys import argv
from os.path import exists
script, from_file, to_file = argv
print "Copying from %s to %s" % (from_file, to_file)
# we could do these two on one line too, how?
input = open(from_file)
indata = input.read()
print "The input file is %d bytes long" % len(indata)
print "Does the output file exist? %r" % exists(to_file)
print "Ready, hit RETURN to continue, CTRL-C to abort."
raw_input()
output = open(to_file, 'w')
output.write(indata)
print "Alright, all done."
output.close()
input.close()
スクリプトを短縮して、適切に実行することができたのは次のとおりです(スクリプトが目的のテキストを目的のファイルに正常にコピーすることを意味します)...
from sys import argv
from os.path import exists
script, from_file, to_file = argv
input = open (from_file)
indata = input.read ()
output = open (to_file, 'w')
output.write (indata)
print コマンドと 2 つの close コマンドを削除しました (「コマンド」の使い方が間違っていたらすみません... 私はコーディングに非常に慣れておらず、まだ専門用語を理解していません)。
スクリプトをさらに短縮しようとすると、エラーが発生します。たとえば、「input」コマンドと「indata」コマンドを次のように 1 行にまとめようとしました...
input = open (from_file, 'r')
次に、スクリプト内の「indata」参照を「input」に変更しました...
from sys import argv
from os.path import exists
script, from_file, to_file = argv
input = open (from_file, 'r')
output = open (to_file, 'w')
output.write (input)
しかし、次の TypeError が発生します...
new-host:python Eddie$ python ex17.py text.txt copied.txt
Traceback (most recent call last):
File "ex17.py", line 10, in <module>
output.write (input)
TypeError: expected a character buffer object
スクリプトをさらに短くするにはどうすればよいでしょうか?それとも、Zed が提案したように 1 行に短縮するにはどうすればよいでしょうか?