2016-04-10 8 views
0

Ich habe einen file.dat dieser Art, aber mit viel mehr Daten:Python - speichern, um verschiedene Dateien ausgewählte Zeilen und Spalten von Daten

Apr 1 18:15 [n1_Cam_A_120213_O.fits]: 
4101.77 1. -3.5612 3.561 -0.278635 4.707 6.448  #data1 
0.03223 0. 0.05278 0.05278 0.00237 0.4393 0.4125 #error1 
4088.9  1. -0.404974 0.405 -0.06538 5.819 0.  #data2 
    0.  0. 0.01559 0.01559 0.00277 0.1717 0.  #error2 
4116.4  1. -0.225521 0.2255 -0.041111 5.153 0.  #data3 
    0.  0. 0.01947 0.01947 0.00368 0.4748 0.  #error3 
4120.8  1. -0.382279 0.3823 -0.062194 5.774 0.  #data4 
    0.  0. 0.01873 0.01873 0.00311 0.3565 0.  #error4 

Apr 1 18:15 [n1_Cam_B_120213_O.fits]: 
4101.767 0.9999 -4.57791 4.578 -0.388646 0.03091 7.499 #data1 
0.0293  0.  0.03447 0.03447 0.00243 0.00873 0.07529 #error1 
4088.9  1.  -0.211493 0.2115 -0.080003 2.483 0. 
    0.  0.  0.01091 0.01091 0.00327 0.1275 0. 
4116.4  1.  -0.237161 0.2372 -0.040493 5.502 0. 
    0.  0.  0.02052 0.02052 0.00231 0.5069 0. 
4120.8  1.  -0.320798 0.3208 -0.108827 2.769 0. 
    0.  0.  0.0167 0.0167 0.00404 0.1165 0. 

erste Zeile jeden Datensatz ein name.fits enthält, auch Zeilen enthalten Werte und ungerade Zeilen (außer dem ersten) enthalten Fehler der Werte in der vorherigen Zeile. Dann kommt eine leere Zeile und beginnt erneut.

Was ich brauche, ist die Information in verschiedene Dateien auf diese Weise zu trennen:

name1.fits data1[1] err1[1] data1[2] err1[2] data1[3] err1[3]... 
name2.fits data1[1] err1[1] data1[2] err1[2] data1[3] err1[3]... 

Also die nächste Datei

name1.fits data2[1] err2[1] data2[2] err2[2] data2[3] err2[3]... 
name2.fits data2[1] err2[1] data2[2] err2[2] data2[3] err2[3]... 

Dann wird die erste neue Datei meiner Daten aussehen würde wäre wie :

n1_Cam_A_120213_O.fits 4101.77 0.03223 1.  0. -3.5612 0.05278 3.561 0.05278 -0.278635 0.00237 4.707 0.4393 6.448 0.4125 
n1_Cam_B_120213_O.fits 4101.767 0.0293 0.9999 0. -4.57791 0.03447 4.578 0.03447 -0.388646 0.00243 0.03091 0.00873 7.499 0.07529 

Hier ist, was habe ich bisher:

with open('file.dat','r') as data, open('names.txt', 'a') as nam, open('values.txt', 'a') as val, open('errors.txt', 'a') as err: 
    for lines in data.readlines(): 
     cols = lines.split()  
     if "fits" in lines: 
      header = lines.split() 
      nam.write(header[3]) 
     elif float(cols[0]) > 1: 
      #print cols[0] 
      x=str(cols)   
      val.write(x) 
     elif float(cols[0]) < 1: 
      #print cols[0] 
      y=str(cols) 
      err.write(y)        

Ich beginne gerade mit Python. Ich dachte in separaten Namen Werte und Fehler in verschiedenen Dateien und wählen Sie dann die Zeilen und Spalten, die ich brauche. Aber da ich mich mit Hunderten von Zeilen und Dateien beschäftigen werde, würde ich mir einen automatischeren Ansatz wünschen. Was ich will, ist die ersten 3 Zeilen zu lesen und schreiben Sie Datei1, dann Zeilen 1,4,5 und schreiben Sie Datei2, dann Zeilen 1,6,7 und schreiben Sie Datei3, dann Zeilen 1,8,9 und schreiben Sie Datei4, dann leer zu überspringen Zeilen und lese Zeilen 11,12,13 und schreibe Datei1, dann Zeilen 11,14,15 und schreibe Datei2, und so weiter (oder so ähnlich).

Antwort

0

Probieren Sie den folgenden Code, ist es das, was Sie brauchen?

Das Ergebnis Benennungsschema 0, 1, 2, ...

first = False 
for i in open('file.dat'): 
    i = i.strip() 
    if not i: 
     continue 

    if 'fits' in i: 
     name = i.split()[3][1:-2] 
     data = None 
     first = not first 
     if first: 
      out = [] 

     cur = -1 
    else: 
     if not data: 
      data = i.split() 
      if first: 
       out.append(open('%d' % len(out), 'w')) 
      else: 
       cur += 1 

      out[cur].write(name) 
     else: 
      for d, e in zip(data, i.split()): 
       out[cur].write(' %s %s' % (d, e)) 

      out[cur].write('\n') 
      data = None 
+0

Danke für Ihre Antwort. Vielleicht fehlt mir etwas, aber die erzeugten Dateien sind leer. Ich bin irgendwie mit deinem Code verloren, ich werde es mir genauer ansehen. – JVR

+0

Ich entfernte den Kommentar wie # data1, # error1 – Like

+0

Ich bekomme immer noch leere Ausgänge. Erhalten Sie mit dem Code etwas anderes als es ist? – JVR

0

ich es endlich geschafft, es zu Werke zu bekommen, aber vielleicht könnten Sie ein paar Tipps geben mir es besser. Hier ist es:

with open('file.log','r') as data, open('out1.txt', 'w') as out1, open('out2.txt', 'w') as out2: 


    def readError(error): # original data had errors inside parenthesis 
     newError = [] 
     for e in error: 
      e = e.replace('(','').replace(')','')    
      e = e.split() 
      newError.extend(e) 
     return newError 

    for lines in open('file.log','r'):  
     lines = data.readline() 
     cols = lines.strip().split()  
     if "fits" in lines: 
      name = cols[3].replace('[','').replace(']','').replace(':','') + ' ' + '0' + ' ' + '1' 
      # 0 and 1 were some indexes I needed to add to each line 

      for i in range(0,2): # I needed to write 2 files 
       dato = data.readline().strip().split() 
       error_dato = readError(data.readline().strip().split()) 
       newline = '' 
       if i == 0: 
        newline = name 
        for j in range(0, 7): # data had 7 columns 
         newline = newline + ' ' + dato[j] + ' ' + error_dato[j] 
        print newline 
        out1.write(newline + '\n') 
       elif i == 1: 
        newline = name 
        for j in range(0, 7): 
         newline = newline + ' ' + dato[j] + ' ' + error_dato[j] 
        print newline 
        out2.write(newline + '\n') 

     linea = data.readline().strip() 
     # I don't know why the code doesn't work without this line