Search code examples
pythonexceptionglob

How to create file exception for multiple file analysis in Python


I am analysing a large set of weather data (about 13000 files) and writing the results to a file. Is there a way of implementing the code I have below in such a way that it will ignore problematic files, that is, if a particular file produces an error, can I make it skip this file and continue on to the rest? Some sort of exception for glob? Files are in .oax format and output file is .txt.

Around which segments would I need to include the try and exception commands?

import sharppy
import sharppy.sharptab.profile as profile
import sharppy.sharptab.interp as interp
import sharppy.sharptab.winds as winds
import sharppy.sharptab.utils as utils
import sharppy.sharptab.params as params
import sharppy.sharptab.thermo as thermo
import numpy as np
from StringIO import StringIO
import glob
import os


os.chdir('X:/ybbn_snding_data-oax/ybbn_snding_data-oax')
for file in glob.glob("*.oax"):
    spc_file = open(file, 'r').read()


    def parseSPC(spc_file):
    ## read in the file
    data = np.array([l.strip() for l in spc_file.split('\n')])

    ## necessary index points
    title_idx = np.where( data == '%TITLE%')[0][0]
    start_idx = np.where( data == '%RAW%' )[0] + 1
    finish_idx = np.where( data == '%END%')[0]

    ## create the plot title
    data_header = data[title_idx + 1].split()
    location = data_header[0]
    time = data_header[1][:11]

    ## put it all together for StringIO
    full_data = '\n'.join(data[start_idx : finish_idx][:])
    sound_data = StringIO( full_data )

    ## read the data into arrays
    p, h, T, Td, wdir, wspd = np.genfromtxt( sound_data, delimiter=',', comments="%", unpack=True )

    return p, h, T, Td, wdir, wspd

pres, hght, tmpc, dwpc, wdir, wspd = parseSPC(spc_file)

prof = profile.create_profile(profile='default', pres=pres, hght=hght, tmpc=tmpc, \
                                    dwpc=dwpc, wspd=wspd, wdir=wdir, missing=-9999, strictQC=True)
msl_hght = prof.hght[prof.sfc] # Grab the surface height value
#print "SURFACE HEIGHT (m MSL):",msl_hght
agl_hght = interp.to_agl(prof, msl_hght) # Converts to AGL
#print "SURFACE HEIGHT (m AGL):", agl_hght
msl_hght = interp.to_msl(prof, agl_hght) # Converts to MSL
#print "SURFACE HEIGHT (m MSL):",msl_hght
sfcpcl = params.parcelx( prof, flag=1 ) # Surface Parcel
fcstpcl = params.parcelx( prof, flag=2 ) # Forecast Parcel
mupcl = params.parcelx( prof, flag=3 ) # Most-Unstable Parcel
mlpcl = params.parcelx( prof, flag=4 ) # 100 mb Mean Layer Parcel
print mupcl.bplus, "," # J/kg
print mupcl.bminus, "," # J/kg
print mupcl.lclhght, "," # meters AGL
print mupcl.lfchght, "," # meters AGL
print mupcl.elhght, "," # meters AGL
print mupcl.li5, "," # C
sfc = prof.pres[prof.sfc]
p3km = interp.pres(prof, interp.to_msl(prof, 3000.))
p6km = interp.pres(prof, interp.to_msl(prof, 6000.))
p1km = interp.pres(prof, interp.to_msl(prof, 1000.))
mean_3km = winds.mean_wind(prof, pbot=sfc, ptop=p3km)
sfc_6km_shear = winds.wind_shear(prof, pbot=sfc, ptop=p6km)
sfc_3km_shear = winds.wind_shear(prof, pbot=sfc, ptop=p3km)
sfc_1km_shear = winds.wind_shear(prof, pbot=sfc, ptop=p1km)
print utils.comp2vec(mean_3km[0], mean_3km[1])[1], ","
print utils.comp2vec(sfc_6km_shear[0], sfc_6km_shear[1])[1], ","
srwind = params.bunkers_storm_motion(prof)
#print "Bunker's Storm Motion (right-mover) [deg,kts]:", utils.comp2vec(srwind[0], srwind[1])
#print "Bunker's Storm Motion (left-mover) [deg,kts]:", utils.comp2vec(srwind[2], srwind[3])
srh3km = winds.helicity(prof, 0, 3000., stu = srwind[0], stv = srwind[1])
srh1km = winds.helicity(prof, 0, 1000., stu = srwind[0], stv = srwind[1])
print srh3km[0], ","
stp_fixed = params.stp_fixed(sfcpcl.bplus, sfcpcl.lclhght, srh1km[0], utils.comp2vec(sfc_6km_shear[0], sfc_6km_shear[1])[1])
ship = params.ship(prof)
eff_inflow = params.effective_inflow_layer(prof)
ebot_hght = interp.to_agl(prof, interp.hght(prof, eff_inflow[0]))
etop_hght = interp.to_agl(prof, interp.hght(prof, eff_inflow[1]))
print ebot_hght, ","
print etop_hght, ","
effective_srh = winds.helicity(prof, ebot_hght, etop_hght, stu = srwind[0], stv = srwind[1])
print effective_srh[0], ","
ebwd = winds.wind_shear(prof, pbot=eff_inflow[0], ptop=eff_inflow[1])
ebwspd = utils.mag( ebwd[0], ebwd[1] )
print ebwspd, ",a"
scp = params.scp(mupcl.bplus, effective_srh[0], ebwspd)
stp_cin = params.stp_cin(mlpcl.bplus, effective_srh[0], ebwspd, mlpcl.lclhght, mlpcl.bminus)
#print "Supercell Composite Parameter:", scp
#print "Significant Tornado Parameter (w/CIN):", stp_cin
#print "Significant Tornado Parameter (fixed):", stp_fixed
f = open('nonstormdayvalues.txt','a')
a=str(mupcl.bplus)    
f.write(a) 
f.write(",")
b=str(mupcl.bminus)
f.write(b)
f.write(",")
c=str(mupcl.lclhght)
f.write(c)
f.write(",")
d=str(mupcl.elhght)
f.write(d)
f.write(",")
e=str(mupcl.li5)
f.write(e)
f.write(",")
g=str(utils.comp2vec(mean_3km[0], mean_3km[1])[1])
f.write(g)
f.write(",")
h=str(utils.comp2vec(sfc_6km_shear[0], sfc_6km_shear[1])[1])    
f.write(h)
f.write(",")
i=str(srh3km[0])
f.write(i)
f.write(",")
j=str(ebot_hght)
f.write(j)
f.write(",")
k=str(etop_hght)
f.write(k)
f.write(",")
l=str(effective_srh[0])
f.write(l)
f.write(",")
m=str(ebwspd)
f.write(m)
f.write(",a")
f.close

Solution

  • Use

    try:
        #run something
        #if some file is a bad file/ operation not allowed
        #raises exception
    except Exception as e:
        #print e
        #or do something else if error raised
    

    You can use this in a loop if some error is raised it excepts and continue to loop