2017-03-01 473 views
0

我想將* .sav文件的內容轉換爲Python中的* .csv文件。我寫了下面幾行代碼來訪問* .sav文件中變量的詳細信息。現在,我不是我怎麼能訪問的可變數據寫入到與標題將.sav文件轉換爲Python中的.csv文件

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

以下是結果,當我運行的代碼上面的行.csv文件明確:

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'>] 
-------------------------------------------------- 

任何人都可以告訴我如何將所有可變數據寫入.csv文件?

我想寫的變量(年,DOY,d_lon,d_lat,on2_grid,on2_grid_smooth)到CSV或ASCII文件應該以下列方式看:

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 
..... 

的「形狀on2_grid 「和」on2_grid_smooth「變量是相同的並且是(101,202)。兩者都是「numpy.ndarray」類型。

+0

你想寫哪個變量?什麼是csv應該是什麼樣子?我們還應該知道要編寫的數組的形狀和dtype。 – hpaulj

回答

0

我可以通過改變所需的輸出格式,解決我的問題,在這裏是我的代碼:

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() 
1

在使用你的代碼中提取的文件緯度和經度的列看起來互換。此外,緯度範圍從0到180(不是+90 0 -90))... 0是否從頂部開始。 PL。評論。

+0

謝謝麥克!我已糾正。 – Madhavan

0

我的工作就可以了,並且就目前而言,這是我的「差」的解決方案:

首先我導入模塊savReaderWriter到的.sav文件轉換成結構化的陣列 其次,我導入模塊numpy的轉換結構數組到csv:

import savReaderWriter 
import numpy as np 

reader_np = savReaderWriter.SavReaderNp("infile.sav") 
array = reader_np.to_structured_array("outfile.dat") 
np.savetxt("outfile2.csv", array, delimiter=",") 
reader_np.close() 

問題是我在轉換過程中失去了名稱屬性。我會盡力解決這個問題。

0

我知道這個解決方案使用R代替python,但它非常簡單並且效果很好。

library(foreign) 
write.table(read.spss("inFile.sav"), file="outFile.csv", quote = TRUE, sep = ",")