0

私はcsvリーダーとライターの両方を持っています。基になるオブジェクトを開いたり閉じたりする必要があることを理解しています。これを行う 1 つの方法は、最初にファイル オブジェクト f を作成し、csv リーダーを使用してから f.close() を使用することです。

ただし、次のことはできないようです。

with open(outputpath) as f_outputfile:

    outputfile = csv.writer(f_outputfile)

OTHER CODE HERE

私がやりたいことは、一度に多数のリーダーと多数のライターを一度に開き、それらをすべて自動的に閉じることです。しかし、それはネストされた「With」ブロックがあるということですか?

4

2 に答える 2

5

書き込み:

with open(outputpath) as f_outputfile:
    outputfile = csv.writer(f_outputfile)

OTHER CODE HERE

基本的に次のものと同じです。

f_outputfile = open(outputpath)
try:
    outputfile = csv.writer(f_outputfile)
finally:
    f_outputfile.close() 

OTHER CODE HERE

開いているファイルに依存している場合OTHER CODE HERE、それは機能しません。

于 2012-05-17T19:27:04.193 に答える
3

次のように、 withステートメントに複数のアイテムをスタックできます(これは2.7.x以降の機能のようです)。

with open(foo) as f_foo, open(bar) as f_bar:
    # do something

7.5。withステートメント

バージョン2.5の新機能。

withステートメントは、コンテキストマネージャーによって定義されたメソッドでブロックの実行をラップするために使用されます(「ステートメントコンテキストマネージャーの使用」セクションを参照)。これにより、便利な再利用のために、最終的に使用パターンをカプセル化することを除いて、一般的な試行が可能になります。

with_stmt ::=  "with" with_item ("," with_item)* ":" suite
with_item ::=  expression ["as" target]
于 2012-05-17T19:24:31.863 に答える