5

この演習を行っているときに、問題に遭遇しました。

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()

# we could do these two on one line too, how?は私を混乱させているものです。私が思いついた唯一の答えは:

indata = open(from_file).read()

これは私が望んでいた方法で実行されましたが、削除する必要があります:

input.close()

入力変数が存在しないためです。では、どうすればこのクローズ操作を実行できますか?

これをどのように解決しますか?

4

7 に答える 7

14

Python でリソースを操作するための推奨される方法は、コンテキスト マネージャーを使用することです。

 with open(infile) as fp:
    indata = fp.read()

このwithステートメントは、リソースのクローズとクリーンアップを処理します。

必要に応じて、次のように 1 行で記述できます。

 with open(infile) as fp: indata = fp.read()

ただし、これは python では悪いスタイルと見なされます。

withブロック内の複数のファイルを開くこともできます。

with open(input, 'r') as infile, open(output, 'w') as outfile:
    # use infile, outfile

おもしろいことに、Python を学び始めたときとまったく同じ質問をしました。

于 2012-06-08T09:24:09.290 に答える
2
with open(from_file, 'r') as f:
  indata = f.read()

# outputs True
print f.closed
于 2012-06-08T09:27:51.637 に答える
2

これは、より短い方法で行うべきであるというアドバイスではなく、返さinputれるものの単なる名前であることを理解するための演習と考えてください。open

他の回答が言及しているように、この特定のケースでは、正しく特定した問題はそれほど問題ではありません.スクリプトはかなり早く閉じるので、開いたファイルはかなり早く閉じられます. しかし、常にそうであるとは限りません。ファイルを使い終わったらファイルが閉じられることを保証する通常の方法は、withステートメントを使用することです。これについては、Python を続けていくうちにわかります。

于 2012-06-08T09:29:31.063 に答える
0

次の Python コードで目的を達成できます。

from contextlib import nested

with nested(open('input.txt', 'r'), open('output.txt', 'w')) as inp, out:
    indata = inp.read()
    ...
    out.write(out_data)
于 2012-06-08T09:33:06.697 に答える
0

既存のコード行の間にセミコロンを使用するだけです。

in_file = open(from_file); indata = in_file.read()

彼はあなたが求めていたものだと思います..

于 2016-12-13T03:30:09.960 に答える
0

スクリプトが完了すると、ファイルは自動的かつ安全に閉じられます。

于 2012-06-08T09:23:07.807 に答える