Search code examples
pythoncsvnumpyscipy

Convert a .sav file to .csv file in Python


I want to convert the contents of *.sav file into a *.csv file in Python. I have written the following lines of code to access the details of variables in *.sav file. Now, I am not clear on how I can write the accessed variable data to a .csv file with headers

import scipy.io as spio
on2file = 'ON2_2015_112m_220415.sav'
on2data = spio.readsav(on2file, python_dict=True, verbose=True)

Following is the result when I run the above lines of the code:

IDL Save file is compressed
 -> expanding to /var/folders/z4/r3844ql123jgkq1ztdr4jxrm0000gn/T/tmpVE_Iz6.sav
--------------------------------------------------
Date: Mon Feb 15 20:41:02 2016
User: zhangy1
Host: augur
--------------------------------------------------
Format: 9
Architecture: x86_64
Operating System: linux
IDL Version: 7.0
--------------------------------------------------
Successfully read 11 records of which:
 - 7 are of type VARIABLE
 - 1 are of type TIMESTAMP
 - 1 are of type NOTICE
 - 1 are of type VERSION
--------------------------------------------------
Available variables:
 - saved_data [<class 'numpy.recarray'>]
 - on2_grid_smooth [<type 'numpy.ndarray'>]
 - d_lat [<type 'numpy.float32'>]
 - on2_grid [<type 'numpy.ndarray'>]
 - doy [<type 'str'>]
 - year [<type 'str'>]
 - d_lon [<type 'numpy.float32'>]
--------------------------------------------------

Can anyone suggest me with how I can write all the variable data to a .csv file?

I want to write the variables (year, doy, d_lon, d_lat, on2_grid, on2_grid_smooth) to a CSV or ASCII file is supposed to look in the following manner:

longitude, latitude, on2_grid, on2_grid_smooth   # header 
0.0,0.0,0.0,0.0              
0.0,0.0,0.0,0.0 
0.0,0.0,0.0,0.0 
0.0,0.0,0.0,0.0
..... 

The shape of "on2_grid" and "on2_grid_smooth" variables is the same and is (101, 202). Both are of the type "numpy.ndarray".


Solution

  • I could solve my problem by changing the requisite output format and here is my code:

    import scipy.io as spio
    import numpy as np
    import csv
    
    on2file = 'ON2_2016_112m_220415.sav'   # i/p file
    outfile = 'ON2_2016_112m_220415.csv'   # o/p file
    
    # Read i/p file
    s = spio.readsav(on2file, python_dict=True, verbose=True)
    
    # Creating Grid
    #d_lat = s["d_lat"]
    #d_lon = s["d_lon"]
    lat = np.arange(-90,90,1.78218)  # (101,)
    lon = np.arange(-180,180,1.78218)     # (202,)
    ylat,xlon = np.meshgrid(lat,lon)
    
    on2grid = np.asarray(s["on2_grid"])
    on2gridsmooth = np.asarray(s["on2_grid_smooth"])
    
    nrows = len(on2grid)
    ncols = len(on2grid[0])
    
    xlon_grid = xlon.reshape(nrows*ncols,1)
    ylat_grid = ylat.reshape(nrows*ncols,1)
    on2grid_new = on2grid.reshape(nrows*ncols,1)
    on2gridsmooth_new = on2gridsmooth.reshape(nrows*ncols,1)
    
    # Concatenation
    allgriddata = np.concatenate((xlon_grid, ylat_grid, on2grid_new, on2gridsmooth_new),axis=1)
    
    # Writing o/p file
    f_handle = file(outfile,'a')
    np.savetxt(f_handle,allgriddata,delimiter=",",fmt='%0.3f',header="longitude, latitude, on2_grid, on2_grid_smooth")
    f_handle.close()