简体   繁体   中英

IPython console too small to print data, how to write to file?

I am using Spyder (Python 2.7) to analyse some files, and printing out derived values in the IPython console. This worked well for smaller folders of data, as all the results could be printed in the console. I'm a python beginner, so I'm unsure of how I could adapt my code below to write these results to a file (txt or csv) rather than printing them to the IPython console.

For each file the data output should look like this, although being printed on one line would also be fine. Ideally, I wan't all the data to be appended to the same output file. Is there an easy way of adapting the lines that contain the print command into a command to write to a file? I've had some experience with csv.DictWriter but I am unsure of how to use it in this situation.

1063.3187872 ,
-243.615246702 ,
867.312033099 ,
3301.47950932 ,
10813.0 ,
-3.86140412292 ,
14.3743086525 ,
27.4415273499 ,
10.5395891182 ,
0.0 ,
53.0 ,
0.0 ,
0.0 ,a

My code is below:

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:/nonseabreezestormdays')
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

Appending your output to a file :

f = open('myfile.txt','a')
f.write(mupcl.bplus+ ",")
f.write(mupcl.bminus+ ",")
f.write(mupcl.lclhght+ ",")
f.write(mupcl.elhght+ ",")
f.write(mupcl.li5+ ",")
# do this as long as you need to
##f.seek(0,0) # return to the beginning of the file if you need to
f.close() # close the file handle

You may add a \\n at the end of each line to get all those line on writes on different lines in the file.

You can write to a file in Python using the builtin write method of a file object. First you need to open the file, so use

with open(filename, 'w') as file:

and everything below that should be indented. Then just change all the print statements from print x, y to file.write(str(x) + str(y) + '\\n')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM