0

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 行に短縮するにはどうすればよいでしょうか?

4

7 に答える 7

4

ライブラリを使用するshutilだけで、OS にコピーの負担を負わせることができます (Python でデータを読み書きする代わりに)。

import shutil
shutil.copy('from_file', 'to_file_or_directory_name')
于 2012-07-21T17:21:08.843 に答える
3
from sys import argv
open(argv[2], 'w').write(open(argv[1]).read())

あなたがそれを得ることができるのと同じくらい短いです。セミコロンを使用してそれらを1行に結合することもできますが、それは行末文字を別のものに置き換えるだけであり、実際には役に立ちません。

于 2012-07-21T17:05:43.803 に答える
3

あなたが得る現在のエラーはこれによるものです:

input = open (from_file, 'r')

output.write (input)

write()はパラメーターとして文字列を必要とするため、ファイル オブジェクトを指定しています。

また、冗長なものを排除/コードを短縮しようとしているため、小さな項目ですが、ファイルを開く'r'ためのデフォルトのモードはead であり、読み取りのためにファイルを開くときに指定する必要はありません。

また、with構造体を使用してファイルを開いて管理することも検討してください。利点は、完了したとき、または例外が発生したときにファイルが自動的に閉じられるため、明示的なclose()必要がないことです。例えば、

with open('data.txt') as input:
   ## all of your file ops here

PEP08 -- Python のスタイル ガイド( Python プログラマーにとって「必読」) は、関数と開始点の間にスペースを入れないことを提案しています(

1行の目標が常により優れた、またはより読みやすいソリューションになるかどうかはわかりません。そのため、覚えておく必要があります。

于 2012-07-21T17:00:28.157 に答える
0

これが著者が探していたものかどうかはわかりませんが、試行錯誤を繰り返した結果、私が思いついた解決策がここにあります。私自身初心者ですので、その点はご了承ください。スクリプトは次のとおりです。

               from sys import argv; script, from_file, to_file = argv
               in_file = open(from_file).read(); out_file = open(to_file, 'w').write(in_file)
于 2014-09-24T11:27:39.200 に答える
0

私は「1行で」ディレクティブを文字通りに取り、インポート行を完全に省略しました。私もそれがより友好的だと思います:

open(raw_input("To file? "), "w").write(open(raw_input("From file? ")).read())

まだ「ファイルへ」を閉じませんが、ちょっと、1 行!

--EDIT-- 気付いたのですが、スクリプトが終了すると、Pythonは"To file" を閉じます。だから、やった、一行!

于 2014-10-09T12:19:05.683 に答える