python关于netcdf文件的读写

由于项目是关于气象的。所以需要做这个关于气象的东西。

得知netcdf是网络通用格式文件,于是老板叫找个python下面的有关这个的读取

无奈是netcdf支持c, fortan ,c++就是没有python的包

于是在github里面去找,找到一个关于python的工具于是就成功了。这里记录下安装的坑吧。总共花了2天时间,不断龟速下载和安装尝试现在总结下方法。

1. 首先是去网站里面

http://www.unidata.ucar.edu/downloads/netcdf/index.jsp   这个网址里面下载netcdf for c 稳定版

安装方法:

tar -zxvf netcdf***.tar.gz
    cd netcdf*
    mkdir /usr/local/netcdf
    ./configure --prefix=/usr/local/netcdf --libdir=/usr/lib/ --includedir=/usr/lib/ --sharedstatedir=/usr/share --bindir=/usr/bin/
如果装了intel编译器,会提示math.h的错误,加上CC=icc
   make & make check
   make install

2. 如果第一步提示不成功,可能是缺少zlib hdf5

去百度hdf5下载一个18.0+版本的按下面方法安装,这个最难装经常报错,实在不行直接先不管,这里教程有很多步骤可能是重复的,因为我安装的方法很多种已经记不清楚了,。反正按这个步骤来一遍 基本上能成功

tar -zxvf hdf5***.tar.gz
    cd hdf5*
    mkdir /usr/local/hdf5
    ./configure --prefix=/usr/local/hdf5 --libdir=/usr/lib/ --includedir=/usr/lib/ --sharedstatedir=/usr/share --bindir=/usr/bin/
   make & make check
   make install
再安装zlib

  tar -zxvf zlib***.tar.gz
    cd zlib*
    mkdir /usr/local/zlib
    ./configure --prefix=/usr/local/zlib --libdir=/usr/lib/ --includedir=/usr/lib/ --sharedlibdir=/usr/share
其中 --libdir=/usr/lib/ --includedir=/usr/lib/一定写上,把库文件与头文件装在系统默认搜寻的地方,免得后面设置LD_LIBRARY_PATH ,如果不懂可用./configure --help 查看
   make & make check
   make install

这些都是很容易百度到下载的,所以请不要直接问在哪里下载了

3. 第2步是第一步的基础,前两部成功后再开始安装关于python的。

https://github.com/gersolar/netcdf

这个git上面的工具是我试过能够成功的,根据里面的readme.md 方法

$ pip install netcdf
这里如果报denied permisson之类的可能是因为没用管理员权限

ubuntu下面用sudo pip install netcdf

这一步速度可鞥会很慢,就等等。也可以加提速镜像

sudo pip install netcdf -i http://e.pypi.python.org/simple

当提示缺少Dataset或者hydf等等。  就先sudo pip install Dataset之类的  再重新安装netcdf。 

这里反正要等很久。也是最关键的一部 。 可能1,2两步的东西这里也会自动安装,我想前面安装了,他会自动跳过吧

4. 前面都好了。就把https://github.com/gersolar/netcdf 这个clone下来 不会的请先学git使用。

然后

$ make deploy
或者

$ make ubuntu deploy

5. 就是测试了。这里给个教程

CDL全称为network Common data form Description Language,它是用来描述netcdf文件
的结构的一种语法格式。它包括前面所说的三种netcdf对象(变量、维、属性)的具体定义。
看一个具体例子(这个例子cdl文件是从netcdf教程中的2.1 节The simple xy Example摘出来的) 
netcdf simple_xy {
dimensions:
x = 6 ;
y = 12 ;
variables:
int data(x, y) ;
data:
data =
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71 ;
}
上面的代码定义了一个符合netcdf格式的结构simple_xy,  
这个结构包括三个部分
1、维的定义,以dimensions:关键字开头
   dimensions:
 x = 6 ;
 y = 12 ;
 定义了两个轴(或者说两维),名字分别为x和y,x轴的长度(准确的说是坐标点的个数)为6,
 y轴的长度为12。
2、变量的定义:以variables:开头
 variables:
  int data(x, y);
  定义了一个以x轴和y轴为自变量的函数data,数学公式就是f(x,y)=data;
  注意维出现的顺序是有序的,它决定data段中的具体赋值结果.
3、数据的定义,以data:开头
 data:
data =
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71 ;
这个段数据用数学的函数公式f(x,y)=data来看,
就是  x=0,y=0时,data = 0;
     x=0,y=1时,data = 1;
     
     
     x=5,y=11是,data=71;
要注意的是,
1、赋值顺序:
我们给出的是c格式的cdl文件,因此这里的赋值顺序和c语言中的一致,也就是通常所说的“行式赋值”,
而fortran语言中则是“列式赋值”,因此在fortran格式的cdl文件中,data段的数值顺序和这里正好
行列互换。     
2、自变量的默认取值和坐标变量
   如果只给出维的长度,那么维的值默认从0开始,然后自动加1,到(长度-1)停止,
   很多情况下我们要自己给出每个点的坐标值,这时就需要用到netcdf里的坐标变量
   "coordinate varibles":增加一个和只和维相关的一元函数(自变量)并给出它的取值范围。
   比如下面的cdl文件(摘自netcdf教程中的2.2 The sfc pres temp Example)
   netcdf sfc_pres_temp {
 dimensions:
 latitude = 6 ;        //纬度轴
 longitude = 12 ;      //经度轴
 variables:
 float latitude(latitude) ;    //坐标变量,存储具体纬度
 latitude:units = "degrees_north" ;
 float longitude(longitude) ;  //坐标变量,存储具体纬度
 longitude:units = "degrees_east" ;
 float pressure(latitude, longitude) ;   //某个点(经度和纬度的交点)的大气压值
 pressure:units = "hPa" ;           //大气压的单位为
 float temperature(latitude, longitude) ; //某个点(经度和纬度的交点)的温度值
 temperature:units = "celsius" ;    //温度的单位为
 data:
 latitude = 25, 30, 35, 40, 45, 50 ;
 longitude = -125, -120, -115, -110, -105, -100, -95, -90, -85, -80, -75, -70 ;
 pressure =
 900, 906, 912, 918, 924, 930, 936, 942, 948, 954, 960, 966,
 901, 907, 913, 919, 925, 931, 937, 943, 949, 955, 961, 967,
 902, 908, 914, 920, 926, 932, 938, 944, 950, 956, 962, 968,
 903, 909, 915, 921, 927, 933, 939, 945, 951, 957, 963, 969,
 904, 910, 916, 922, 928, 934, 940, 946, 952, 958, 964, 970,
 905, 911, 917, 923, 929, 935, 941, 947, 953, 959, 965, 971 ;
 temperature =
 9, 10.5, 12, 13.5, 15, 16.5, 18, 19.5, 21, 22.5, 24, 25.5,
 9.25, 10.75, 12.25, 13.75, 15.25, 16.75, 18.25, 19.75, 21.25, 22.75, 24.25,
 25.75,
 9.5, 11, 12.5, 14, 15.5, 17, 18.5, 20, 21.5, 23, 24.5, 26,
 9.75, 11.25, 12.75, 14.25, 15.75, 17.25, 18.75, 20.25, 21.75, 23.25, 24.75,
 26.25,
 10, 11.5, 13, 14.5, 16, 17.5, 19, 20.5, 22, 23.5, 25, 26.5,
 10.25, 11.75, 13.25, 14.75, 16.25, 17.75, 19.25, 20.75, 22.25, 23.75,
 25.25
 对于上面的数据,就是
 latitude = 25,longitude = -125时,pressure = 900,temperature =  9;
 latitude = 25,longitude = -120时,pressure = 906,temperature =  10.5;
 以此类推。
 


把上面的第一个列子保存为 *.cdl文件 

然后在命令行里面

ncgen -o simple_xy.nc simple_xy.cdl生成netcdf格式文件simple_xy.nc

然后先

在命令行下执行ncdump simple_xy.nc,这时屏幕的输出和simple_xy.cdl内容完全一样。说明
     我们的文件读写操作都是正确的。

最后进入python命令行

$python

然后

>>>

from netCDF4 import Dataset
f = Dataset('**刚才保存的名字.nc')
v = f.variables['data']

print v[0]

如果有数据,就说明成功了。enjoy it !



你可能感兴趣的:(python,netcdf)