2011-10-24 11 views
4

私はパスを取得し、このファイルの内容を返す関数を記述しようとしています。エラー処理は必要ありません。私は、次の一度にファイル全体を読む

def read_all_1(path): 
    f = open(path) 
    s = f.read() 
    f.close() 
    return s 

def read_all_2(path): 
    with open(path) as f: 
     return f.read() 

私の質問を思い付いてきました:もっとニシキヘビと考えられている1

  • 2番目の関数では、ファイルは自動的に "with"の手段で閉じられますか?
  • は良い方法でしょうか、おそらくいくつかの組み込み関数ですか?
+2

この場合、ほとんどのpythonicは関数の記述に気を配りません。 –

+0

@StevenRumbalski: 'do_something_with(read_all(path)+ something_else) 'のような式でこの関数を使いたいと思っています。 – georg

+1

@StevenRumbalskiは、 txt ')。read()) 'は非常に「ガベージコレクション」されます。 – heltonbiker

答えて

9

これらはどちらも非常に不快です。あなたの2番目の質問に答えるために、2番目の機能では、ファイルは実際に自動的に閉じられます。これは、withステートメントで使用されるプロトコルの一部です。皮肉なことに、このファイルはではなく、が最初の例で閉じられていることが保証されています(さらに1秒後に表示されます)。

最終的に、私はwithステートメントを使用することを選択すると、ここに理由ですでしょう - PEP 343に従って:あなたが見ることができるように、あなたは多くを得る

mgr = (EXPR) 
exit = type(mgr).__exit__ # Not calling it yet 
value = type(mgr).__enter__(mgr) 
exc = True 
try: 
    try: 
     VAR = value # Only if "as VAR" is present 
     BLOCK 
    except: 
     # The exceptional case is handled here 
     exc = False 
     if not exit(mgr, *sys.exc_info()): 
      raise 
     # The exception is swallowed if exit() returns true 
finally: 
    # The normal and non-local-goto cases are handled here 
    if exc: 
     exit(mgr, None, None, None) 

with EXPR as VAR: 
    BLOCK 

がに変換されこの場合、ファイルは途中で何が起こったとしても閉じられることが保証されています。これは読みやすさのためにも役立ちます。ファイルを開こうとする度にこのコードブロックを置かなければならないと想像してください!

+0

ありがとうございました – georg

3

私は2番目のものを言わないだろう、とはいファイルがクローズされ、このようなwith声明を考える:

try: 
    f = open(filepath) 
    <code> 
finally: 
    f.close() 

あなたの3番目の質問について何の開口部を含まない他の方法がありませんファイル。


第三の方法は、(明示的にファイルを閉じず)とすることができる:ファイルオブジェクトがガベージコレクションされるとき

open(filepath).read() 

ファイルが閉じられますが、私見明示は暗黙よりも良好です。

関連する問題