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
中了。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0DOXlVaGdkW2FjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzkzNxMDOzgTMxAzMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.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()
注意
-
文件路径和文件名中不能有中文!而读hdf5的filename
却没有这个毛病,真是令人费解。h5py
- 通常nc文件中除了
还有variables
和dimensions
,如果需要的话将最后一行中的groups
对应改一下。不过目前我接触到的文件中并没有人把数据放到file.variables
里(想象成nc文件里的文件夹),而groups
基本都是读文件前已知的,还是按需读取吧。dimensions
netCDF4格式支持多个无限维度,当有大量矩阵形式的数据(具体数据量又未知)要存取时可以把nc文件当成一个简易数据库,这就涉及到netCDF4写入操作了。下次再说~
**喜欢的话请关注吧,天晓得还会更新什么不好玩儿的东西:**