Python3.读取nc和hdf的套路

nc和hdf是一家人,5行Python代码一锅端

网上各种读取nc和hdf格式的教程很多,我总结了一个简单暴力、性价比相当高的套路,总共只要4~5行Python代码(核心代码只有2行),通吃netCDF3、netCDF4、hdf3、hdf4:

import netCDF4 as nc

filename = r"E:\whatever.nc"  # 也可以是hdf文件

with nc.Dataset(filename) as file:
    file.set_auto_mask(False)  # 可选
    variables = {x: file[x][()] for x in file.variables}

最终nc或hdf中的所有变量以字典的形式存在variables中了。

ndarray.png

演示环境:

  • python 3.7.2
  • netcdf4 1.4.2

假如要读取hdf4格式的文件好像还要装hdf4库(我也记不得当时是自动安装的还是手动安装的了)。

讲解

  • 这个套路依赖的主要是netCDF4的强大兼容性,在读取过程中自动判断文件的具体格式。
  • with语句会自动关闭打开的文件,省去手动调用关闭方法的一行代码。
  • 最后一行中file.variables是类似字典的视图,用在循环中遍历的就是是文件中的变量名。
  • 最后一行中用字典解析式(有的教程里叫字典推导)压缩了循环遍历变量的代码。
  • 最后一行中[()]获取变量的值是我从h5py的使用中学的,之所以不用更常用的[:]是因为在h5py中如果变量是标量会报Illegal slicing argument for scalar dataspace的错。虽然netCDF4中好像不存在这个问题,但是[()]体现了一种周全的思维,拿来用也不报错。
  • 注释可选的那一行如果去掉,读出来的变量是numpyd的MaskedArray类型如下图,和正常ndarray几乎一样只不过增加了对缺测值的表示。我习惯打开矩阵看到数值所以有这一句,如果喜欢读出数据后用matplotlib.pyplot.imshow()迅速画个图看看的话可以把这一句去掉。

MaskedArray.png

注意

  • filename文件路径和文件名中不能有中文!而读hdf5的h5py却没有这个毛病,真是令人费解。
  • 通常nc文件中除了variables还有dimensionsgroups,如果需要的话将最后一行中的file.variables对应改一下。不过目前我接触到的文件中并没有人把数据放到groups里(想象成nc文件里的文件夹),而dimensions基本都是读文件前已知的,还是按需读取吧。

netCDF4格式支持多个无限维度,当有大量矩阵形式的数据(具体数据量又未知)要存取时可以把nc文件当成一个简易数据库,这就涉及到netCDF4写入操作了。下次再说~

**喜欢的话请关注吧,天晓得还会更新什么不好玩儿的东西:**

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/modabao/article/details/88066020