15

これらと行ごとの処理のためにファイルを開く方法とのトレードオフ/違いを理解しようとしています

with open('data.txt') as inf:
    for line in inf:
       #etc

for line in open('data.txt'):
   # etc

with「with-block」(スイート?)が終了した(または例外がカウンターされた)ときに、を使用するとファイルが確実に閉じられることを理解しています。だから私はwithここでそれについて知って以来ずっと使っています。

Re for-loop:ネットやSOを調べてみると、for-loopが抜けたときにファイルが閉じられるかどうかは実装依存のようです。そして、この構造が例外をどのように処理するかについては何も見つかりませんでした。誰か知っていますか?

上記の何かについて間違っている場合は、訂正していただければ幸いforです with。(選択肢があると仮定すると、つまり、Python のバージョンに制限されません)

4

3 に答える 3

33

これの問題

for line in open('data.txt'):
   # etc

開いているファイルへの明示的な参照を保持していないということですか、それではどのようにファイルを閉じますか?怠惰な方法は、ガベージコレクターがクリーンアップするのを待つことですが、それはリソースがタイムリーに解放されないことを意味する場合があります。

だからあなたは言うことができます

inf = open('data.txt')
for line in inf:
   # etc
inf.close()

forループ内にいるときに例外が発生した場合はどうなりますか?ファイルは明示的に閉じられません。

追加するtry/finally

inf = open('data.txt')
try:
    for line in inf:
       # etc
finally:
    inf.close()

これは非常に単純なことを行うための多くのコードであるため、Pythonを追加withして、このコードをより読みやすい方法で記述できるようにしました。ここに私たちを連れて行く

with open('data.txt') as inf:
    for line in inf:
       #etc

したがって、これがファイルを開くための推奨される方法です。Pythonがwithステートメントに対して古すぎる場合は、try/finally本番コードのバージョンを使用する必要があります

于 2012-06-21T02:32:06.963 に答える
3

withステートメントはPython2.5でのみ導入されました。以前のバージョンに下位互換性の要件がある場合にのみ、後者を使用する必要があります。

もう少し明確にする

withステートメントは(ご存知のように)try / exception / finalyシステムを包含するように導入されました-これは理解するのに素晴らしいことではありませんが、大丈夫です。Python(CのPython)では、Pythonを実装すると開いているファイルが閉じられます。言語自体の仕様には書かれていません...したがって、IPython、JPythonなどは、ファイルを開いたままにしたり、メモリを開いたり、次のGCサイクルまでリソースを解放しないことを選択できます(または、 CPython GCは、.NETまたはJavaのものとは異なります...)。

私がそれに対して聞いた唯一のことは、それが別のインデントレベルを追加するということだと思います。

要約すると、2.5未満では機能せず、「as」キーワードが導入され、インデントレベルが追加されます。

それ以外の場合は、通常どおり例外の処理を制御し続け、何かがエスケープされた場合、finallyブロックはリソースを閉じます。

私のために働く!

于 2012-06-21T01:12:24.980 に答える
-3
import os

path = "c:\\fio"
longer_path = "c:\\fio\\"
# Read every file in directory
for filename in os.listdir(path):
    print()
    print("Here is the file name",filename)
    inf = open(longer_path+filename)
    try:
        for line in inf:
            print(line,end='')
    finally:
        inf.close()

#output
Here is the file name a.txt
mouse
apple
Here is the file name New Text Document - Copy.txt
cat
Here is the file name New Text Document.txt
dog
于 2018-04-11T02:46:46.770 に答える