本文介绍了如何批量下载 CMIP6 数据。
1. 注册并登录
- 打开CMIP6官网:https://esgf-node.llnl.gov/search/cmip6/;
- 点击网页右上角的 Create Account 注册账户;
- 进入注册界面,填写相关资料(只用填写加粗的必填部分),完成注册;
- 注册成功后登录帐号,会在右上角显示用户信息,并且可以使用 Data Chart 。
2. 选择数据
- 第一步,在左侧设置相应的条件选择自己需要的数据;
- 第二步,在 “Total Number of Result” 处可以看到搜索结果数;
- 第三步,设置页面显示结果数大于搜索结果数(这样能一次性将结果添加进 Data Cart 中);
- 第四步,点击 Add all displayed results to Data Cart ,将搜索结果添加进 Data Cart 中;
- 第五步,My Data Cart 后面的括号中显示搜索到的结果数,说明添加成功。
3. 获取下载链接
- 点击 My Data Cart ,进入数据车;
- 勾选 Select All Datasets ,并点击 WGET Script 打开脚本下载界面,下载所有 WGET 脚本;
为了获得更好的性能,ESGF 分别为每个数据中心生成 WGET 脚本,不同数据中心的数据下载速度不同,数据中心的数据节点状态可查看网址:https://esgf-node.llnl.gov/status/(或者点击右上角的 Data Nodes Status 查看)。
- 下载脚本时会出现如下状态,点击仍然发送即可下载;
实际上可以用WGET根据脚本直接批量下载,但是还没成功实现,因此采用了一个略麻烦的方法。
- 用 VS Code 或者记事本打开脚本,可以看到脚本中各文件的下载链接信息;
- 将脚本中所有链接复制出来保存到一个文本文件中(例如:从数据源 esgf-node.llnl.gov 中获取的链接保存为 gov.txt );
- 建议每个脚本中的链接单独复制保存,不要放在一起,这样有利于提高下载效率。
4. 清洗链接数据
- 从脚本中复制出的链接信息中(例如 gov.txt ),第一列为文件名,第二列为下载链接,之后的几列为验证信息(详见上图);
- 为了方便下载,需要清洗复制出来的信息(例如 gov.txt ),只提取下载链接并保存(例如 gov-url.txt )。
if __name__ == '__main__':
fw = open("C:\\Users\\xxx\\Desktop\\gov-url.txt", 'w') # 创建url保存文件
with open("C:\\Users\\xxx\\Desktop\\gov.txt", 'r') as fr: # 读取所有下载链接信息
for line in fr.readlines(): # 按行读取
line = line.strip('\n').split(' ') # 去掉换行符并分割
url = line[1].replace("'", '') # 清洗并获取待下载地址
fw.writelines(url + '\n') # 将下载地址写入保存文件中
fw.close() # 关闭文件
5. 批量下载
通过Internet Download Manager(IDM)软件和迅雷批量下载数据。
(1)IDM 批量下载
- IDM 的安装和配置详见博客批量下载ERA5数据(Python+IDM);
- 复制清洗后的下载链接(例如 gov-url.txt );
- 打开 IDM 软件,点击左上角 任务 ,点击 从剪贴板中添加批量下载 ;
- 在批量下载界面中会显示每个待下载文件信息;
- 选择 所有文件保存至同一目录(即文件下载目录);
- 点击 全部选择 ,勾选所有文件;
- 点击 确定 ,在弹出的新窗口中点击 确定 即可将所有文件添加进队列中开始下载。
- 修改同时下载文件个数:在主界面点击 队列 - 主要下载队列 ,选择 队列中的文件 ,修改同时下载文件个数后,点击 应用 完成修改。
可能出现的特殊情况:
点击 从剪贴板中添加批量下载 后,文件类型和文件大小可能会出现“Error”或者为空的情况(如下图),首先检查一下数据中心的数据节点状态( https://esgf-node.llnl.gov/status/ ),如果没问题,尝试将下载链接的 http 修改为 https ,若问题没解决,则放到迅雷中下载。
(2)迅雷批量下载
不直接用迅雷的原因:(1)下载速度不如 IDM 快;(2)氪金才能变强(建议充值一个会员)
- 复制清洗后的下载链接(例如 gov-url.txt );
- 打开迅雷,点击左上角 新建 ,迅雷会自动从剪贴板中读取下载链接,点击 确定 ;
- 设置文件保存路径,点击 确定 ,开始下载。
6. 查漏与分组
下载过程中还需检查所有数据是否都完整下载,另外,下载完后还需对数据进行分组。下面提供两段代码分别用于查漏和数据分组。
(1)查漏
- 基于从WGET脚本中复制出来的链接信息进行检查(例如 gov.txt ),依次遍历每个文件名,判断是否在已下载文件中出现,如果没出现则为遗漏的文件,将其下载链接统一保存在一个文本文件中。
import os
if __name__ == '__main__':
fw = open("C:\\Users\\xxx\\Desktop\\remain.txt", 'w') # 存放未下载的数据链接
with open("C:\\Users\\xxx\\Desktop\\gov.txt", 'r') as fr: # 读取所有下载链接信息
for line in fr.readlines(): # 按行读取
line = line.strip('\n').split(' ') # 去掉换行符并分割
filename = line[0].replace("'", '') # 文件名
url = line[1].replace("'", '') # 下载地址
if filename not in os.listdir("F:\\CMIP6"): # 判断文件名是否在已下载文件中出现
fw.writelines(url + '\n') # 将下载地址写入保存文件中
fw.close() # 关闭文件
(2)分组
- 基于文件名中的信息对数据进行分组,选择分组依据,判断文件是否是这一类型,若是则移动到对应的文件夹内。
import os
import shutil
'''
例如:tas_day_NorESM2-LM_ssp370_r1i1p1f1_gn_20150101-20201231.nc
按模式 NorESM2-LM 对数据分组
'''
if __name__ == '__main__':
folderpath = "E:\\CMIP6" # 数据存放路径
for filename in os.listdir(filepath): # 获取所有文件名并遍历
groupname = filename.split('_')[2] # 分组的组名
newpath = folderpath + '\\' + groupname # 新存放文件夹
if not os.path.exists(newpath): # 判断文件夹是否存在
os.mkdir(newpath) # 不存在则创建
filepath = folderpath + '\\' + filename # 文件详细路径
shutil.move(filepath, newpath) # 将文件移动到新文件夹中
7. 最后
- 内容仅供大家学习参考,若有不足之处,敬请大家批评指正!