Python调用CDO及其它系统指令(下载资料)

之前一篇文章简单介绍了Climate Data Operators (CDO) 如何处理气候数据的软件,并提到配合Python可以方便的使用,这里就再进一步讲解如何在Python中调用CDO,以及其它系统指令。虽然CDO发布了Python-cdo提供了直接使用的方法,但是这里给一些不能安装python-cdo或者其它原因不使用这个库的用户一个其它的方法。

一、 Python调用CDO

这里只需要使用os库(操作系统接口)即可完成,更确切的说,是os.system()函数。

1
import os

system函数可以将字符串转化成命令在服务器上运行;其原理是每一条system函数执行时,其会创建一个子进程在系统上执行命令行,子进程的执行结果无法影响主进程。有了这个函数,我们就可以在python脚本里随意使用CDO了。比如:

1
os.system('cdo selname,t2m ./in.nc ./out.nc')

通常而言,我们会利用CDO批量处理一些数据,一条一条输入太过麻烦,这时候灵活利用循环format格式化函数就可以实现,如我们下载了NCEP再分析资料1948-2020年逐日的pressure level的温度数据,我们需要提取每年500 hPa的数据并且合并成1个文件:

1
2
3
4
5
6
7
import os
filePath = './data/'
filename = os.listdir(filePath)#获取文件名
for i in range(len(filename)):#对文件循环
os.system('cdo sellevel,500 {}{} {}t500_{}.nc'.format(filePath,filename[i],filePath,i)) #对每个文件提取500hpa 变量,并输出为名为500_x.nc的文件x=0,1,2,3....
os.system('cdo -b 32 mergetime {}t500_* {}t500.nc'.format(filePath,filePath)) #合并
os.system('rm -f {}t500_*'.format(filePath)) #删除所有中间文件

这里需要注意的是格式化函数的匹配,比如对os.system(‘cdo sellevel,500 {}{} {}t500_{}.nc’.format(filePath,filename[i],filePath,i))这行代码而言,代码中一共有四个{},分别对应filePath,filename[i],filePath和i。

二、Python调用其它系统指令

既然python可以通过os.system函数调用CDO,那同样也可以调用其它指令,实际上在上边一个示例的最后一行代码已经涉及到了,调用了系统的rm函数删除了中间文件。

我在批量下载气象数据(EC;NCEP;CMIP)介绍过使用bash脚本批量下载数据的方法,这里我们进行一点简单的修改,就可以在python里实现批量下载。

1
2
3
4
import numpy as np
import os
for i in np.arange(1948,2021,1):
os.system('wget ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/hgt.{}.nc'.format(i))

对于不熟悉shell语言的伙伴们,看到这样的方法可能会更亲切一点吧。需要注意的是wget语句会默认将文件下载到python脚本所在路径,通过-O 参数可以指定下载路径。

1
wget -O ./data/1948.nc ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/hgt.1948.nc

当然wget还有更多参数,有兴趣的可以参考wget参数

当然如果你使用的是jupyternotebook,那可能你无法看到下载进度了。当然也有一个不是办法的应对办法,安装一个进度条库:

1
pip install tqdm
1
2
3
4
5
6
import numpy as np
import os
from tqdm.notebook import tqdm

for i in tqdm(np.arange(1948,2021,1)):
os.system('wget ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/hgt.{}.nc'.format(i))

这时再试试看使用了tqdm有什么区别呢?