天天看點

用python腳本實作JRA-55資料批量下載下傳

今天開完組會,小小放松一下哈哈,更新一下許久沒更新的CSDN(登陸太少,好多私信和評論都沒回複,尴尬哈哈)

我之前下載下傳JRA-55的monthly資料,上ftp用手點!用手點!!![破音] 太慘了,簡直慘絕人寰。

最近要用到daily資料,手點是不可能的,這輩子都不可能的。我搜了一下,好像沒看到介紹用伺服器批量下載下傳JRA-55的資料(之前有類似的文章,但都是轉載官網的,說什麼編shell腳本,連接配接ftp,我水準有限,沒做出來...),是以決定開個坑介紹一下如何用python腳本(内附腳本)對JRA-55資料進行批量下載下傳。

開始前注意點:(急的不行,要趕緊下載下傳的話,直接看腳本吧hhh)

1. 關于你自己:

(1)有JRA-55的賬戶密碼

(2)安裝好python(我用的python3.7) 其中ftplib這個包應該是自帶的,如果沒有的話,安裝一下哈。

用python腳本實作JRA-55資料批量下載下傳

(3)可以在自己電腦上下,但是建議挂在伺服器上下載下傳(可能八成大概會快一點兒吧)

2. 關于JRA-55:

(1)JRA-55下載下傳一次連接配接不能超過1個小時(是以後面,我通過斷開連接配接、并分三次下載下傳來規避這個問題)

(2)JRA-55賬戶一個24小時裡總連接配接時長不能超過12小時(不是很嚴格,但是太長時間,JRA會把和你的連接配接斷開; 為了規避這個問題,我找朋友借了一個賬戶,兩個賬戶輪流下載下傳)

(3)JRA-55下載下傳巨慢!我用伺服器下載下傳,一個2.2M的檔案要大概40秒~1分半。(是以我設定了下載下傳大概40個檔案斷開一次)

3. 關于本程式:

(1)本人python剛入門的水準...(也可能還沒入門,是以可能繁瑣一些,不過是能用的哈哈)主要學習地點:(對本程式有什麼不懂直接去看這個連結吧,我是基于他的工作基礎上做的)

https://www.cnblogs.com/GouQ/p/11874194.html

(2)程式目的:總思路是下載下傳1960~2018年6~8月所有位勢高度(hgt)日資料。

(3)程式流程:1°設定好使用者名、密碼→ 2°設定JRA-55要下載下傳的檔案位置→ 3°連接配接FTP → 4° 逐個下載下傳檔案(一個月是120/124個檔案),分三次下載下傳,每次下載下傳40個左右,以規避1個小時的連結限制。

程式:(含下載下傳單個檔案和批量下載下傳)

# 學習位址:https://www.cnblogs.com/GouQ/p/11874194.html

# 使用python批量下載下傳JRA55daily資料

# 2020.9.9  hhx

from ftplib import FTP

import os

def ftpDownloadFile(ftp, ftpfile, localfile):

    bufsize = 1024

    path    = os.path.join(localfile,ftpfile[-23:])

    with open(path, 'wb') as fid:

        print('downloading:',ftpfile)

        ftp.retrbinary('RETR {0}'.format(ftpfile), fid.write, bufsize)  # 接收伺服器檔案并寫入本地檔案

        print('downloading successful!!!')

    return True

ftpserver = 'ds.data.jma.go.jp'

userID    = 'honghx'                    #這裡填JRA55的賬戶,我随便給的示例,應該是 'jraxxxxx'

Password  = 'dianzan'               #這裡填JRA55密碼,我随便給的示例,我猜密碼是你的名字+生日 哈哈哈哈

print(userID)

localfile = '/home/honghx/data/JRA55_Daily_hgt/'      #這裡要注意了!你要下載下傳到你自己的檔案夾下!這是我伺服器的位置

year      = range(1960,2018,1)         #我下載下傳1960~2018年的資料

month     = range(6,9,1)                   #我下載下傳6~8月的資料,不要懷疑,就是(6,9,1)

# --下載下傳單個資料(有時候因為種種原因要下單獨的一個資料,就把批量的部分注釋掉,用這段)

# file_name = '/JRA-55/Hist/Daily/anl_p125/200306/anl_p125_hgt.2003061700'

# ftp       = FTP()

# ftp.connect(ftpserver , 21      )

# ftp.login  (userID    , Password)

# flag      = ftpDownloadFile(ftp,file_name,localfile)

# --批量下載下傳資料

for year_ind in year:

    for month_ind in month:

        ftpath    = '/JRA-55/Hist/Daily/anl_p125/'+str(year_ind)+str(month_ind).zfill(2)+'/'  #确定下載下傳的地方,建議用ftp看看在哪裡,再寫進來

        result = []                 #result是所有要下載下傳的檔案名的集合

        ftp=FTP()

        ftp.connect(ftpserver , 21      )

        ftp.login  (userID    , Password)      # 使用者登陸

        print('\n------- ftp connection successful!!! --------')

        for item in ftp.nlst(ftpath):

            if 'anl_p125_hgt.'+str(year_ind)+str(month_ind).zfill(2) in item:

                result.append(item)

        print('result length: '+str(len(result)))

        #這個月要下的所有資料名都有了,我們準備下載下傳了,我print了這個月的檔案個數,看看對不對

        for i in range(int(len(result)/3)):    #為什麼要分成3塊下載下傳,在前文的注意點2 /(1) 給出理由了

            file_name = result[i]

            flag      = ftpDownloadFile(ftp,file_name,localfile)

            print(""+file_name[-23:]+": "+str(flag))

            del(file_name)

        ftp.quit()

        print('\n------- ftp disconnected!!! --------')

        del(ftp)

        ftp=FTP()

        ftp.connect(ftpserver , 21      )

        ftp.login  (userID    , Password)      # 使用者登陸

        print('\n------- ftp connection successful!!! --------')

        for i in range(int(len(result)/3),int(len(result)/3*2),1):

            file_name = result[i]

            flag      = ftpDownloadFile(ftp,file_name,localfile)

            print(""+file_name[-23:]+": "+str(flag))

            del(file_name)

        ftp.quit()

        print('\n------- ftp disconnected!!! --------')

        del(ftp)

        ftp=FTP()

        ftp.connect(ftpserver , 21      )

        ftp.login  (userID    , Password)      # 使用者登陸

        print('\n------- ftp connection successful!!! --------')

        for i in range(int(len(result)/3*2),len(result),1):

            file_name = result[i]

            flag      = ftpDownloadFile(ftp,file_name,localfile)

            print(""+file_name[-23:]+": "+str(flag))

            del(file_name)

        ftp.quit()

        print('\n------- ftp disconnected!!! --------')

        del(ftp)

        del(ftpath)

        del(result)

用python腳本實作JRA-55資料批量下載下傳

下載下傳好啦!

寫在最後:JRA-55的日資料下載下傳實在緩慢,同比ERA5雖然暫時隻能從1979年下載下傳起,不過以後會提供1950年開始的,是以我推薦大家以後用ERA5吧。ERA5下載下傳更快(大概500K左右,有時候快一些),分辨率更高(0.25°),當然了還是得看再分析資料在你所在區域的表現能力哈!

繼續閱讀