2016-06-28 70 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