2016-06-28 36 views
0

比較值I具有的打開含有波數和強度這樣的信息文件中的代碼的一部分:迭代上的文件,使用Python

500.21506 -0.00134 
500.45613 0.00231 
500.69720 -0.00187 
500.93826 0.00129 
501.17933 -0.00049 
501.42040 0.00028 
501.66147 0.00114 
501.90253 -0.00036 
502.14360 0.00247 

我的代碼試圖解析兩個給定波長之間的信息:lowwav和highwav。我想只打印落在lowwav和highwav之間的波數的強度。我的整個代碼如下所示:

import datetime 
import glob 
path = '/Users/140803/*' 
files = glob.glob(path) 

for line in open('sfit4.ctl', 'r'): 
      x = line.strip() 
      if x.startswith('band.1.nu_start'): 
       a,b = x.split('=') 
       b = float(b) 
       b = "{0:.3f}".format(b) 
       lowwav = b 
      if x.startswith('band.1.nu_stop'): 
       a,b = x.split('=') 
       b = float(b) 
       b = "{0:.3f}".format(b) 
       highwav = b 

with open('\\_spec_final.t15', 'w') as f: 
    with open('info.txt', 'rt') as infofile: 
     for count, line in enumerate(infofile): 
      lat = float(line[88:94]) 
      lon = float(line[119:127]) 
      year = int(line[190:194]) 
      month = int(line[195:197]) 
      day = int(line[198:200]) 
      hour = int(line[201:203]) 
      minute = int(line[204:206]) 
      second = int(line[207:209]) 
      dur = float(line[302:315]) 
      numpoints = float(line[655:660]) 
      fov = line[481:497] # field of view? 
      sza = float(line[418:426]) 
      snr = 0.0000 
      roe = 6396.2 
      res = 0.5000 
      lowwav = float(lowwav) 
      highwav = float(highwav) 
      spacebw = (highwav - lowwav)/ numpoints 

      d = datetime.datetime(year, month, day, hour, minute, second) 
      f.write('{:>12.5f}{:>12.5f}{:>12.5f}{:>12.5f}{:>8.1f}'.format(sza,roe,lat,lon,snr)) # line 1 
      f.write("\n") 
      f.write('{:>10d}{:>5d}{:>5d}{:>5d}{:>5d}{:>5d}'.format(year,month,day,hour,minute,second)) # line 2 
      f.write("\n") 
      f.write(('{:%Y/%m/%d %H:%M:%S}'.format(d)) + "UT Solar Azimuth:" + ('{:>6.3f}'.format(sza)) + " Resolution:" + ('{:>6.4f}'.format(res)) + " Duration:" + ('{:>6.2f}'.format(dur))) # line 3 
      f.write("\n") 
      f.write('{:>21.13f}{:>26.13f}{:>24.17e}{:>12f}'.format(lowwav,highwav,spacebw,numpoints)) # line 4 
      f.write("\n") 


      with open(files[count], 'r') as g: 
       for line in g: 
        wave_no, tensity = [float(item) for item in line.split()] 
        if lowwav <= wave_no <= highwav : 
         f.write(str(tensity) + '\n') 


g.close()   
f.close() 
infofile.close() 

眼下,一切工作正常,除非我比較波長,並打印出相應於lowwav和highwav之間的波長強度的最後一部分。沒有強度打印到輸出文件中。

+0

你在第一行數據中缺少'5'嗎? –

+0

是 - 複製/粘貼錯誤 – alli

+0

好的,最後的'close()'調用是無用的,因爲你在任何地方都使用'with'。 AFAIK的代碼應該工作。你確定該範圍內有任何值嗎?嘗試打印解析出的'wave_no'的值,看看'lowwav'和'highwav'之間是否有內容。 – Bakuriu

回答

1

的問題是,當你遍歷文件g你有效地移動它的「文件指針」。所以第二個循環在開始時找到該文件並且不產生任何值。

其次,你是生產這些nums名單,但羅布泊的每一次迭代陰影的前值,使其無法訪問。

要麼你要收集所有的值,然後遍歷這些:

with open(files[count], 'r') as g: 
    all_nums = [] 
    for line in g: 
     all_nums.append([float(item) for item in line.split()]) 

    for nums in all_nums: 
     if (lowwav - nums[0]) < 0 or (highwav - nums[0]) > 0 : 
      f.write(str(nums[1])) 
      f.write('\n') 
     else: break 

或者只在第一循環中的一切(這應該是更有效):

with open(files[count], 'r') as g: 
    for line in g: 
     nums = [float(item) for item in line.split()] 
     if (lowwav - nums[0]) < 0 or (highwav - nums[0]) > 0 : 
      f.write(str(nums[1])) 
      f.write('\n') 
     else: break 

還要注意當條件是首次假break聲明將停止值的處理,你可能想將其刪除。


此說,請注意您的代碼打印這裏nums[0]要麼lowwav大,或者比highwav較小的所有值,這意味着如果lowwav < highwav數值將被打印出來。你可能想使用and代替or如果要檢查它們是否lowwavhighwav之間。此外,在Python中,你可以只寫lowwav < nums[0] < highwav這一點。

我會親自使用以下方法:

with open(files[count], 'r') as g: 
    for line in g: 
     wave_no, intensity = [float(item) for item in line.split()] 
     if lowwav < wave_no < highwav: 
      f.write(str(intensity)+'\n') 
+0

'或'必須是'和',如果我正確理解OP。頻率必須被限制在這兩個值之間。另外爲什麼'打破'而不是'繼續'? –

+0

謝謝!它現在正在將數據寫入輸出文件,但是它沒有正確實施比較:無論波數如何,它都會打印出每一個單一的亮度值 - 你知道它爲什麼可能嗎? – alli

+0

當我將「或」更改爲「和」時 - 根本沒有輸出 – alli

0

分割每行空格,解壓分裂列表兩個名字wavelengthintensity

[line.split() for line in r]使得

500.21506 -0.00134 
500.45613 0.00231 

[['500.21506', '-0.00134'], ['500.45613', '0.00231']] 

這listcomp [(wavelength, intensity) for wavelength,intensity in lol if low <= float(wavelength) <= high]回報

[('500.21506', '-0.00134'), ('500.45613', '0.00231')] 

如果你加入他們回來[' '.join((w, i)) for w,i in [('500.21506', '-0.00134'), ('500.45613', '0.00231')]['500.21506 -0.00134', '500.45613 0.00231']

使用listcomp過濾掉波長。並加入wavelengthintensity回到字符串並寫入文件。

with open('data.txt', 'r') as r, open('\\_spec_final.t15', 'w') as w: 
    lol = (line.split() for line in r) 
    intensities = (' '.join((wavelength, intensity)) for wavelength,intensity in lol if low <= float(wavelength) <= high) 
    w.writelines(intensities) 

如果要輸出到終端做print(list(intensities))代替data.txtw.writelines(intensities)
內容;當low是500和high是50`

500.21506 -0.00134 
500.45613 0.00231 
500.69720 -0.00187 
500.93826 0.00129 
501.17933 -0.00049 
501.42040 0.00028 
501.66147 0.00114 
501.90253 -0.00036 
502.14360 0.00247 

輸出;

['500.21506 -0.00134', '500.45613 0.00231'] 
+0

sfit4。ctl文件只是我在highwav和lowwav數字中讀取的地方,我不想對該文件做任何其他更改 – alli

+0

,請參閱更新 –

+0

對不起,我對python非常陌生,我只是感到困惑。我不明白你爲什麼line.split在sfit4.ctl文件中。我不明白.join功能 – alli