今天開完組會,小小放松一下哈哈,更新一下許久沒更新的CSDN(登陸太少,好多私信和評論都沒回複,尴尬哈哈)
我之前下載下傳JRA-55的monthly資料,上ftp用手點!用手點!!![破音] 太慘了,簡直慘絕人寰。
最近要用到daily資料,手點是不可能的,這輩子都不可能的。我搜了一下,好像沒看到介紹用伺服器批量下載下傳JRA-55的資料(之前有類似的文章,但都是轉載官網的,說什麼編shell腳本,連接配接ftp,我水準有限,沒做出來...),是以決定開個坑介紹一下如何用python腳本(内附腳本)對JRA-55資料進行批量下載下傳。
開始前注意點:(急的不行,要趕緊下載下傳的話,直接看腳本吧hhh)
1. 關于你自己:
(1)有JRA-55的賬戶密碼
(2)安裝好python(我用的python3.7) 其中ftplib這個包應該是自帶的,如果沒有的話,安裝一下哈。
(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)
下載下傳好啦!
寫在最後:JRA-55的日資料下載下傳實在緩慢,同比ERA5雖然暫時隻能從1979年下載下傳起,不過以後會提供1950年開始的,是以我推薦大家以後用ERA5吧。ERA5下載下傳更快(大概500K左右,有時候快一些),分辨率更高(0.25°),當然了還是得看再分析資料在你所在區域的表現能力哈!