ftplib下载JRA-55逐日数据

关于JRA55-Daily资料

丑话说在前头:我从未见过如此傻逼的再分析资料!!!

之前我用NCEP的再分析资料比较多,基本是按层次分类,逐月变量一个变量一个文件,逐日变量一年一个文件。ERA那就不说了,鼠标咔咔一通点人自动给你生成下载脚本,拖下来直接跑上就万事大吉。JRA55就不一样了,打开说明文档的一瞬间我就感到大事不妙:它的变量是一组一组存放的,并且命名方式也与我熟悉的规则相去甚远,更不用说官方页面上写了巨大的“由于服务器压力过大,建议大家下一个小时歇一个小时,并每十二小时登出一次以免服务器崩溃”……

以上都是序曲,当真正打开JRA服务器的时候我才感觉到了什么叫两眼一黑:

JRA55逐日资料的存储逻辑是这样的:打开FTP服务器,首先看到的是data01~data20一共20个文件夹,外加一个叫JRA55的文件夹

JRA服务器

点进这个文件夹,再点进Hist,就可以看到不同时次的数据各自的目录。注意:这三个目录都是链接,并不是真实的绝对路径。

JRA55-daily

点进Daily后进入了逐日数据的子目录,此时链接已经把我带到了data19这个文件夹(。到这里还没有结束,我准备先下载高度场数据,于是点进了anl_p125文件夹。在等待了漫长的5分钟后,终于加载出了文件夹下的全部内容:每年每月一个文件夹,足足700多个软链接……

yyyymm

更不要说每个链接底下都是混着放的一大堆变量,而每个变量又都是每天4个时次各一个文件,而且还是GRIB格式,下载的时候需要记得顺带捎上它们的说明文件。第一天我写完下载脚本美滋滋地挂上就回去了,第二天回来一看,好家伙才下了一年就找不到路径了,再仔细一看原来是新的一年他换了一个data文件夹存!而且如果你以为“换一个文件夹”等价于“data文件夹序号+1”那就太天真了,你的逻辑说了不算,目录安排的顺序说了才算,具体的大家自己看看就知道了,实在无力吐槽。

此时经历了n次下载失败的我已经完全抓狂,只想说JRA你自己不会搞就外包出去啊!!整理一下会死吗!!!!

实现方式

综上所述,脚本需要实现这样的功能:

  1. 进入Daily数据的总目录,并根据目录下给出的每个月的yyyymm文件夹链接,获取每个月的实际存储路径。
  2. 进入yyyymm文件夹,挑选出需要的变量对应的文件名。
  3. 由于获取到的文件名排列也是混乱的,为了确认下载进度,对其根据时次进行排序。
  4. 每个文件下载前,若本地已存在对应文件,还需检查文件完整性。

使用到的包

re - 正则表达式

官方文档点我,主要用到了两个函数:

  1. re.match - 匹配文件开头,用于挑选需要的变量
  2. re.search - 提取文件末尾的时次信息用于排序

正则表达式是怎么也绕不开的一个常用包,不过我用得还不是很顺溜,有机会再去慢慢研究。

os- 文件/目录方法

中文文档点我,英文文档点我,菜鸟教程点我

操作本地文件目录,切换文件夹(os.chdir),查询文件大小(os.path.getsize),拼接路径(os.path.join)等。

ftplib - ftp协议客户端

重头戏来了,在这之前我都不知道FTP服务器具体都有哪些指令,为了下这个数据把这个包里所有函数都仔仔细细看了一遍,自己整理了一个表,另外还有一些补充说明,放在文章末尾。

ftplib

pandas & datetime - 时间与日期

网上查了查怎么生成指定时间段内yyyymm的列表,结果发现好些都是写的循环一个一个加出来的,实在是太不优雅(。所以引入了pandas,用一下它的date_range函数。也许其它的包也能实现,不过鉴于我只学了一个pandas,就先有啥用啥啦!

实际脚本

脚本存放在Github,鉴于我还是没搞懂代码高亮怎么整,今天也还是上图。(polacode这个插件真的不错子!

这里本地文件是以wb方式打开,所以如果下载不完全是会直接覆盖本地文件 重新下载。如果单个文件较大的话可以考虑酌情修改。

sftp_py_v2.0

使用效果:

实操

ftp补充说明

ftp-MLSD

ftp工作模式

ftp指令

彩蛋

回来面对半年没见的台式机还有点陌生,重要的是我竟然忘了把wsl映射为网络驱动器是怎么整的了。直接把绝对路径

1
C:\Users\User\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu16.04onWindows_79rhkp1fndgsc\LocalState\rootfs

按照规则改写一下输进映射网络驱动器会报错,后来发现是因为…这是本机地址不算在网络驱动器里【。

正确的操作应该是添加以下地址为网络驱动器。

1
\\wsl$\Ubuntu-16.04

小盆友,你学废了吗???