15

私が書いたこの数行のコードに終了属性が必要ない理由を理解しようとして、とても楽しい時間を過ごしています。

from sys import argv
from os.path import exists

script, from_file, to_file = argv

file_content = open(from_file).read()
new_file = open(to_file, 'w').write(file_content)

new_file.close()

file_content.close()

これに関するいくつかのことや他の人の投稿を読みましたが、彼らのスクリプトは私が現在学んでいるものよりもはるかに複雑だったので、その理由がわかりませんでした.

私はLearning Python the Hard Wayをやっています。助けていただければ幸いです。

4

3 に答える 3

12

file_contentファイルの内容を含む文字列変数です。ファイルとは関係ありません。開いたファイル記述子はopen(from_file)自動的に閉じられます。ファイル セッションは、ファイル オブジェクトがスコープを終了した後 (この場合は の直後.read()) に閉じられます。

于 2012-08-25T02:16:10.183 に答える
3

open(...)はファイル オブジェクトへの参照を返し、readon を呼び出してファイルを読み取り、文字列オブジェクトをwrite返し、書き込みを呼び出して を返します。Noneどちらもclose属性を持っていません。

>>> help(open)
Help on built-in function open in module __builtin__:

open(...)
    open(name[, mode[, buffering]]) -> file object

    Open a file using the file() type, returns a file object.  This is the
    preferred way to open a file.

>>> a = open('a', 'w')
>>> help(a.read)
read(...)
    read([size]) -> read at most size bytes, returned as a string.

    If the size argument is negative or omitted, read until EOF is reached.
    Notice that when in non-blocking mode, less data than what was requested
    may be returned, even if no size parameter was given.
>>> help(a.write)
Help on built-in function write:

write(...)
    write(str) -> None.  Write string str to file.

    Note that due to buffering, flush() or close() may be needed before
    the file on disk reflects the data written.

これを改善するには、いくつかの方法があります。

>>> file = open(from_file)
>>> content = file.read()
>>> file.close()

または python >= 2.5 の場合

>>> with open(from_file) as f:
...     content = f.read()

with、ファイルが閉じていることを確認します。

于 2012-08-25T02:18:09.327 に答える
1

を実行すると、ファイルの内容がfile_content = open(from_file).read()設定さfile_contentれます (によって読み取られますread)。この文字列を閉じることはできません。次のように、ファイル オブジェクトをその内容とは別に保存する必要があります。

theFile = open(from_file)
file_content = theFile.read()
# do whatever you need to do
theFile.close()

にも同様の問題がありnew_fileます。open(to_file)から呼び出しを分離する必要がありwriteます。

于 2012-08-25T02:17:53.593 に答える