2016-08-10 2 views
1

Betrachten Sie die folgenden MWE.Schreiben in verschiedene Dateien entsprechend der Schleifenvariablen

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)) 

Ich erhalte die folgenden Fehler

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

Ich mag Objekt f_500 schreiben in Datei, wenn 'jj' 500 und so weiter. Was könnte der richtige Weg sein, dies zu tun?

Dank

Antwort

3

Sie definieren vier Variablen, deren Werte file Art Objekte auf den Leitungen 1-4. Sie verwenden diese Variablen jedoch nicht in Ihrer for-Schleife. Stattdessen erstellen Sie in Ihrer Schleife mehr Objekte vom Typ file. (Die eingebaute file()-Funktion konstruiert ein file-Objekt mit dem gegebenen Namen.)

Wenn Sie wirklich alle Dateien vorher öffnen möchten, sollten Sie ein Wörterbuch verwenden. Die Dateinamen können mit einer Schleife konstruiert werden, auch:

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') 

Danach können Sie Ihre for jj Schleife tun und die entsprechende Datei-Handle Zugriff mit files[jj].

+0

Vielen Dank. Genau das suche ich. –

0

Dies ist, was Sie in der letzten Anweisung tun müssen werden:

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

Nicht einverstanden mit der Verwendung von Exec ... http://lucumr.pocoo.org/2011/2/1/exec-in-python/ –

+0

Das ist Ihre Wahl, ich habe exec für ziemlich viele Anwendungsfälle nie angetroffen irgendein Problem. – harshil9968

2

Access-Datei Variable als Schlüssel in dict zurück von globals() oder locals(), hängt vom Kontext:

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)) 

Good Luck! :)

Verwandte Themen