lb_toolkits.download.downloadH8 源代码

# -*- coding:utf-8 -*-
'''
@Project  : lb_toolkits

@File     : downloadH8.py

@Modify Time : 2022/8/11 15:34

@Author : Lee

@Version : 1.0

@Description :

'''
import os
import datetime
import re
import time
import logging
logger = logging.getLogger(__name__)

from lb_toolkits.utils import ftppro
from .config import H8_FTP_URL

# TODO 待增加L3级数据下载

[文档] class downloadH8(): def __init__(self, username, password): self.ftp = ftppro(H8_FTP_URL, username, password)
[文档] def searchfile( self, startdate, enddate=None, collection=None, shortname=None, blockids:list=None, bands:list=None, version:str='NC', everyday=False, hoursflag=False, **kwargs ): ''' 查询L1 NC/HSD文件 NC_H09_20250514_0800_R21_FLDK.02401_02401.nc /jma/netcdf/202505/21/ NC_H09_20250521_1150_R21_FLDK.06001_06001.nc /jma/hsd/202504/23/21/ HS_H09_20250423_2150_B08_R304_R20_S0101.DAT.bz2 /pub/himawari/L2/CLP/010/202504/13/12/ NC_H09_20250413_1250_L2CLP010_FLDK.02401_02401.nc Parameters ---------- startdate : datetime.datetime 起始日期 enddate : datetime.datetime, options 结束日期 collection : str 数据标识 shortname : str 产品标识 blockids : list 分块索引 bands : 波段索引 version everyday : bool 只下载每天固定时间段的数据,通过传入的起始结束的小时字段进行处理 hoursflag : bool 下载整点数据 kwargs Returns ------- list 匹配条件的数据下载链接列表 ''' if enddate is None: enddate = startdate urls = [] nowdate = startdate while nowdate <= enddate : # 拼接ftp目录 if collection in ['L1NC'] : srcdir = os.path.join('/jma/netcdf', nowdate.strftime("%Y%m"), nowdate.strftime("%d")) elif collection in ['L1HSD'] : srcdir = os.path.join('/jma/hsd', nowdate.strftime("%Y%m"), nowdate.strftime("%d"), nowdate.strftime("%H")) elif collection in ['L2'] : if shortname in ['ARP'] : if nowdate < datetime.datetime(2022, 9, 27) : version = '030' else: version = '031' srcdir = os.path.join('/pub/himawari/L2/', shortname, version, nowdate.strftime('%Y%m'), nowdate.strftime('%d'), nowdate.strftime('%H')) else: logger.error('暂不支持其他产品【%s】' %(collection)) return None srcdir = srcdir.replace('\\','/') filelist = self.ftp.listdir(srcdir) filelist.sort() for filename in filelist: basename = os.path.basename(filename) basename = basename.replace('.','_') if 'FLDK' not in basename : continue if collection in ['L1NC'] : if shortname not in basename : continue elif collection in ['L1HSD'] : if not basename.endswith('bz2') : continue if bands is not None : search = None for band in bands: search = re.search('B%02d' %(band), basename) if search : break if not search: continue # HS_H09_20250518_1400_B14_FLDK_R20_S0610.DAT.bz2 if blockids is not None : search = None for blockid in blockids: search = re.search('S%02d' %(blockid), basename) if search : break if not search: continue namelist = basename.split('_') ntime = datetime.datetime.strptime(namelist[2]+namelist[3], '%Y%m%d%H%M') if hoursflag : # 仅下载整点 if ntime.minute != 0 : continue if everyday : stime = datetime.datetime(nowdate.year, nowdate.month, nowdate.day, startdate.hour, startdate.minute, startdate.second) etime = datetime.datetime(nowdate.year, nowdate.month, nowdate.day, enddate.hour, enddate.minute, enddate.second) if ntime < stime or ntime > etime : continue else: if ntime < startdate or ntime > enddate : continue srcfile = os.path.join(srcdir, filename) srcfile = srcfile.replace('\\','/') urls.append(srcfile) if version in ['L1NC'] : nowdate += datetime.timedelta(days=1) else: if everyday : nowdate += datetime.timedelta(hours=1) if nowdate.hour > enddate.hour : nowdate = datetime.datetime(nowdate.year, nowdate.month, nowdate.day, startdate.hour, startdate.minute, startdate.second) \ + datetime.timedelta(days=1) else: nowdate += datetime.timedelta(hours=1) return urls
[文档] def download(self, outdir, url, tries=3, timeout=5*60, skip_download=False, cover=False, continuing=True, blocksize=1*1024, **kwargs): """通过ftp接口下载H8 L1数据文件""" if not os.path.isdir(outdir): os.makedirs(outdir) if isinstance(url, list) : count = len(url) for srcname in url: count -= 1 self._download(outdir, srcname, blocksize=blocksize, skip_download=skip_download, count=count + 1) elif isinstance(url, str) : self._download(outdir, url, blocksize=blocksize, skip_download=skip_download)
def _download(self, outdir, url, blocksize=1 * 1024, skip_download=False, count=1): url = url.replace('\\','/') print('='*100) basename = os.path.basename(url) dstname = os.path.join(outdir, basename) if skip_download : return dstname if os.path.isfile(dstname) : logger.info('文件已存在,跳过下载>>【%s】' %(dstname)) return dstname stime = time.time() logger.info('开始下载文件【%d】: %s' % (count, url)) if self.ftp.downloadFile(url, outdir, blocksize=blocksize): logger.info('成功下载文件【%s】:%s' %(count, dstname)) else: logger.error('下载文件失败【%s】:%s' %(count, dstname)) etime = time.time() logger.info('下载文件共用%.2f秒' %(etime - stime)) return dstname