2016-08-10 8 views
1

次のMWEを考慮してください。ループ変数に応じて異なるファイルに書き込む

f_500 = open('halo_classificatio_500_with_surface_pressure_term.txt', 'a') 
f_200 = open('halo_classificatio_200_with_surface_pressure_term.txt', 'a') 
f_178 = open('halo_classificatio_178_with_surface_pressure_term.txt', 'a') 
f_100 = open('halo_classificatio_100_with_surface_pressure_term.txt', 'a') 

over_density = [500,200,178,100] 
for jj in over_density: 
    tm_msun = 2 
    cm_msun = 2 
    vr_mpc = 2 
    file('f_'+str(jj)).write("%s\t%s\t%s\n" % (tm_msun, cm_msun, vr_mpc)) 

私は 'JJ' のように500であるとするとき、オブジェクトf_500をファイルに書きたいと思い、次のエラーに

IOError: [Errno 2] No such file or directory: 'f_500'

を取得しています。これを行う正しい方法は何でしょうか?

おかげ

答えて

3

あなたは値の線1-4にfileタイプのオブジェクトをされている4つの変数を定義しています。しかし、あなたはforループでこれらの変数を使用していません。代わりに、あなたのループでは、より多くのオブジェクトを作成していますfileオブジェクト。 (組み込みのfile()関数は、指定された名前のfileタイプのオブジェクトを構築します。)

事前にすべてのファイルを開くには、辞書を使用する必要があります。ファイル名は、あまりにも、ループを使用して構築することができます。

over_density = [500, 200, 178, 100] 
filename_pattern = 'halo_classificatio_%d_with_surface_pressure_term.txt' 
files = {} 
for d in over_density: 
    files[d] = open(filename_pattern % d, 'a') 

その後、あなたはあなたのfor jjループを行うことができますし、files[jj]で、適切なファイルハンドルにアクセスします。

+0

ありがとうございました。これは私が正確に見ているものです。 –

0

これは、あなたが最後の文にやって必要なものです:

exec('''f_%s.write("%s\t%s\t%s\n" % (tm_msun, cm_msun, vr_mpc))''' % (str(jj))) 
+0

execを使用することに同意しない... http://lucumr.pocoo.org/2011/2/1/exec-in-python/ –

+0

これはあなたの選択です。私は遭遇したことのないかなり多くのユースケースに対してexecを使用しています何の問題。 – harshil9968

2

Accessファイル変数globals()またはlocals()によって返された辞書でキーとして、文脈に依存します。

locals()['f_'+str(jj)].write("%s\t%s\t%s\n" % (tm_msun, cm_msun, vr_mpc)) 
globals()['f_'+str(jj)].write("%s\t%s\t%s\n" % (tm_msun, cm_msun, vr_mpc)) 

グッドラック! :)

関連する問題