python多线程下载ts_基于Python的ERA-5多线程下载(1)
目錄
基于Python的ERA-5多線程下載分為兩部分,《基于Python的ERA-5多線程下載 (1)》,直接再本地使用,即寫代碼的人使用;《基于Python的ERA-5多線程下載 (2)》使用 pyinsaller 將寫好的程序,打包成 .exe 文件,以便其他人使用。
動機
恩師推薦,我的論文可以用到相關數據,然后就對相關數據下載方式調研,在這里做筆記!!!!
后面貼的代碼,我也同時上傳到了到了我的 資源 中,.py文件,下載就可以用,只需關注就能下載(下載之后取消關注也無所謂)。
提示:以下是本篇文章正文內容,案例可供參考
一、正文
基于Python的ERA-5多線程下載分為兩部分,《基于Python的ERA-5多線程下載 (1)》,直接再本地使用,即寫代碼的人使用;《基于Python的ERA-5多線程下載 (2)》將會將寫好的程序,打包成 .exe 文件,以便其他人使用。
1.注冊賬號
登錄 cds.climate.copernicus.eu 網站注冊賬號。
2.登錄賬號,復制 url: 與 key:
登錄賬號后,訪問 api-how-to 網頁,復制 url: 與 key: 。
注意:如果顯示 url:{} 、key: {} 為空,刷新界面;刷新后如果依然是空,網頁右上角查看自己的賬號是否是登錄狀態。
3.創建.cdsapirc本地文件
在本地,進入 C:\Users\Administrator 目錄,右鍵創建空白.txt文件,將名字修改為為".cdsapirc",將第2.步網頁復制的 url: {########}與 key:{#######}粘貼到.cdsapirc文件中,保存。
注意:
在創建文.txt文件,修改文件名,需要確?!蔽募U展名“是打開的,否則你創建的.cdsapirc文件的實際名字為".cdsapirc.txt",因為文件擴展名未打開,你看到的是".cdsapirc"。
此外,根據我的經驗,感覺.cdsapirc相當于一個Cookies的文件,讓服務器認為你一直處于登錄狀態,可能不對,但是你可以這么理解。
4.安裝python環境
慶幸的是,ECMWF提供的cdsapi包,在python2.x與python3.x均可運行,所以大家就無需糾結python版本。我這里用的是python3.7(Anaconda-2019.10),大家自行安裝python(Anaconda)版本就可,我的其他幾篇博文中都有提到。
5.安裝cdsapi包
開始菜單—Anaconda3 (64-bit)—Anaconda Prompt (Anaconda3),執行以下代碼:
如果將自己的python或者Anaconda已經加入環境變量后,直接通過"命令提示符"即 cmd,輸入以下代碼就可安裝。
pip install cdsapi
6.復制腳本內容至本地
在本地創建空白文本(.txt)文件,復制python腳本內容(后面貼出)粘貼至空白文本,將 .txt 后綴改為 .py 后綴。
7.運行腳本,批量下載
開始菜單—Anaconda3 (64-bit)—Anaconda Prompt (Anaconda3),cd 到.py文件所在目錄(如果不在c盤,需要再輸入一次盤符,才能進入到目標目錄中,如圖)
8.修改參量,下載自己產品
大家可以根據自己的需求,調整自己的參數,主要調整參數有:
outDir、‘format’、‘variable’、begin、end
注:
變量名稱,大家可以去產品頁面,選擇自己需要的產品,然后點擊 ”show api request“ ,在代碼中,將變量名稱復制下來,替換自己的代碼中 ‘variable’ 。如圖:
二、腳本
廢話不多說:貼上我的腳本
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@version: Anaconda
@author: LeYongkang
@contact: 1363989042@qq.com
@software: PyCharm
@file: ERA5_Download_Edit
@time: 2021/1/20 0020 下午 9:23
"""
from queue import Queue
from threading import Thread
import cdsapi
from time import time
import datetime
import os
def downloadonefile(data):
ts = time()
outDir = r"E:\python\python3_64b\ERA-5\mslp"
try:
os.makedirs(outDir)
except:
pass
filename=os.path.join(outDir,"era5.mslp."+data+".grib")
if(os.path.isfile(filename)): #如果存在文件名則返回
print("ok",filename)
else:
print(filename)
c = cdsapi.Client()
c.retrieve(
'reanalysis-era5-land',
{
'product_type' : 'reanalysis',
'format' : 'grib', # Supported format: grib and netcdf. Default: grib
# 需要下載的變量產品名稱
'variable': ['skin_temperature', 'surface_thermal_radiation_downwards',],
# 其它變量名參見 https://cds.climate.copernicus.eu/cdsapp#!/dataset/reanalysis-era5-single-levels
'year' : data[0:4],
'month' : data[-4:-2],
'day' : data[-2:],
'time':[
'00:00','01:00','02:00',
'03:00','04:00','05:00',
'06:00','07:00','08:00',
'09:00','10:00','11:00',
'12:00','13:00','14:00',
'15:00','16:00','17:00',
'18:00','19:00','20:00',
'21:00','22:00','23:00'
], #
# 'area' : [60, -10, 50, 2], # North, West, South, East. Default: global
# 'grid' : [1.0, 1.0], # Latitude/longitude grid: east-west (longitude) and north-south resolution (latitude). Default: 0.25 x 0.25
},
filename)
# 下載腳本
class DownloadWorker(Thread):
def __init__(self, queue):
Thread.__init__(self)
self.queue = queue
def run(self):
while True:
# 從隊列中獲取任務并擴展tuple
data = self.queue.get()
downloadonefile(data)
self.queue.task_done()
if __name__ == '__main__':
# 定義程序起始時間,下載結束后,根據結束時間計算共花費多長時間
ts = time()
# 定義下載數據的 起始日期
begin = datetime.date(2015,1,1)
# 定義下載數據的 結束日期
end = datetime.date(2018,12,31)
d = begin
delta = datetime.timedelta(days=1)
#建立下載日期序列
links = []
while d <= end:
data=d.strftime("%Y%m%d")
links.append(str(data))
d += delta
# 創建一個主進程與工作進程通信
queue = Queue()
# 注意,每個用戶同時最多接受4個
# 參考:request https://cds.climate.copernicus.eu/vision
# 創建四個工作線程
for x in range(4):
worker = DownloadWorker(queue)
#將daemon設置為True將會使主線程退出,即使所有worker都阻塞了
worker.daemon = True
worker.start()
# 將任務以tuple的形式放入隊列中
for link in links:
queue.put((link))
# 讓主線程等待隊列完成所有的任務
queue.join()
print('Took Time:{}'.format(time() - ts))
三、引用
雖然代碼不多,但是以我的能力不可能獨立完成,90%參考,然后根據我的代碼習慣(比如說不經常使用main(文件))稍微修改了一下下:
https://mp.weixin.qq.com/s/lOQ_6s8grFSY3TU6XcnO8w
https://github.com/jiangleads/Get_ECMWF_Data
感謝幾位博主的貢獻!!!
四、結語
我也只是個渣渣,是代碼搬運工;這個博文我感覺寫的很細,把我最初接觸代碼的遇到的問題全部都貼上了,希望仔細每一個按照我流程走下來的人,都能得到正確的結果。
最后,其實我參考的博文、GitHub都是我老師給我發過來的,我只是整理了下,走通而已,這么好的老師哪里找。
總結
以上是生活随笔為你收集整理的python多线程下载ts_基于Python的ERA-5多线程下载(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: mybatis修改mysql变量_Jav
- 下一篇: mysql修改索引对交易影响吗_MySQ
