Linux | 安装lb-toolkits 1.2.4库

news2024/9/21 12:39:16

Linux | 安装 lb-toolkits

最近又需要下载葵花的数据,之前分享过一次代码。今天发现之前的环境不小心被我删了,而运行相关的代码需要安装lb-toolkits这个库,今天正好记录了一下安装lb-toolkits的过程。

这里安装的版本是1.2.4,别问为什么是这个版本,因为只安到了这个版本才成功。

  • https://pypi.org/project/lb-toolkits/1.2.4/#files

本来是直接通过

pip install lb-toolkits==1.2.4

命令直接安装的,但是发现一直报错。

安装过程

下面记录一下成功安装的过程

安装python版本

这里先安装python=3.11的版本

 conda create -n py311  python=3.11 

安装相关依赖

由于lb-toolkits需要相关的依赖环境

库名	版本	库名	版本	库名	版本
numpy	1.2.0	pyhdf	0.10.0	h5py	1.0.0
netcdf4	1.0.0	tqdm	4.0.0	gdal	2.0.0
pillow	7.0.0	paramiko	2.10.0	cdsapi	0.5.0

所以在安装之前先安装他的依赖

conda install conda-forge::pyhdf h5py netcdf4 tqdm gdal pillow paramiko cdsapi

安装lb-toolkits 1.2.4

依赖环境安装完了,然后再使用pip 安装具体的版本

pip install lb-toolkits==1.2.4

在这里插入图片描述
安装成功了

测试脚本

运行相关脚本前需要再装一个库

conda install bs4

运行相关脚本,下载2023年8月和9月的数据:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Apr  6 14:25:52 2023

@author: jianpu


"""
import os
import sys
import datetime
import time

from lb_toolkits.tools import ftppro
#from lb_toolkits.tools import writejson




    
class downloadH8(object):

    def __init__(self, username, password):

        self.ftp = ftppro(FTPHOST, username, password)


    def search_ahi8_l1_netcdf(self, starttime, endtime=None, pattern=None, skip=False):
        '''
        下载葵花8号卫星L1 NetCDF数据文件
        Parameters
        ----------
        starttime : datetime
            下载所需数据的起始时间
        endtime : datetime
            下载所需数据的起始时间
        pattern: list, optional
            模糊匹配参数
        Returns
        -------
            list
            下载的文件列表
        '''

        if endtime is None :
            endtime = starttime

        downfilelist = []

        nowdate = starttime
        while nowdate <= endtime :
            # 拼接H8 ftp 目录
            sourceRoot = os.path.join('/jma/netcdf', nowdate.strftime("%Y%m"), nowdate.strftime("%d"))
            sourceRoot = sourceRoot.replace('\\','/')

            # 获取文件列表
            filelist = self.GetFileList(starttime, endtime, sourceRoot, pattern)
            
            # filelist = [f for f in filelist if f.startswith('NC_H08_') and f.endswith('.06001_06001.nc')]
            
            if len(filelist) == 0 :
                nowdate += datetime.timedelta(days=1)
                print('未匹配当前时间【%s】的文件' %(nowdate.strftime('%Y-%m-%d')))
                continue

            nowdate += datetime.timedelta(days=1)
            downfilelist.extend(filelist)

        return downfilelist
    def GetFileList(self, starttime, endtime, srcpath, pattern=None):
        ''' 根据输入时间,匹配获取H8 L1数据文件名  '''
        downfiles = []

        srcpath = srcpath.replace('\\', '/')

        filelist = self.ftp.listdir(srcpath)
        filelist.sort()
        for filename in filelist :
            namelist = filename.split('_')
            nowdate = datetime.datetime.strptime('%s %s' %(namelist[2], namelist[3]), '%Y%m%d %H%M')

            if (nowdate < starttime) | (nowdate > endtime) :
                continue

            downflag = True
            # 根据传入的匹配参数,匹配文件名中是否包含相应的字符串
            if pattern is not None :
                if isinstance(pattern, list) :
                    for item in pattern :
                        if item in filename :
                            downflag = True
                            # break
                        else:
                            downflag = False
                            break
                elif isinstance(pattern, str) :
                    if pattern in filename :
                        downflag = True
                    else:
                        downflag = False

            if downflag :
                srcname = os.path.join(srcpath, filename)
                srcname = srcname.replace('\\','/')

                downfiles.append(srcname)

        return downfiles
    def download(self, outdir, srcfile, blocksize=1*1024, skip=False):
        """通过ftp接口下载H8 L1数据文件"""

        if not os.path.exists(outdir):
            os.makedirs(outdir)
            print('成功创建路径:%s' %(outdir))

        if isinstance(srcfile, list) :
            count = len(srcfile)
            for srcname in srcfile:
                count -= 1
                self._download(outdir, srcname, blocksize=blocksize, skip=skip, count=count+1)

        elif isinstance(srcfile, str) :
            self._download(outdir, srcfile, blocksize=blocksize, skip=skip)

    def _download(self, outdir, srcname, blocksize=1*1024, skip=False, count=1):

        print('='*100)
        basename = os.path.basename(srcname)
        dstname = os.path.join(outdir, basename)

        if skip :
            return srcname

        if os.path.isfile(dstname) :
            print('文件已存在,跳过下载>>【%s】' %(dstname))
            return srcname

        stime = time.time()
        print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
              '开始下载文件【%d】: %s'%(count, srcname))

        if self.ftp.downloadFile(srcname, outdir, blocksize=blocksize):
            print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
                  '成功下载文件【%s】:%s' %(count, dstname))
        else:
            print(datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
                  '下载文件失败【%s】:%s' %(count, dstname))

        etime = time.time()
        print('下载文件共用%.2f秒' %(etime - stime))

        return srcname
 
    
def check_data_completeness(file_list, start_time, end_time):
    
    expected_num_files = (end_time - start_time).days *48 + 48  # 48 show 30min/time; 144 show 10min/time
    actual_num_files = len(file_list)

    if actual_num_files == expected_num_files:
        print("已经下载了全部数据。")
    else:
        print("有 %d 个数据文件缺失。" % (expected_num_files - actual_num_files))
        expected_file_names = []
        actual_file_names = []

        for i in range(expected_num_files):
            file_time = start_time + datetime.timedelta(minutes=i * 30)
            file_name = "NC_H08_%s_R21_FLDK.06001_06001.nc" % (file_time.strftime("%Y%m%d_%H%M"))
            expected_file_names.append(file_name)

        for file_path in file_list:
            file_name = os.path.basename(file_path)
            actual_file_names.append(file_name)

        missing_file_names = set(expected_file_names) - set(actual_file_names)

        for missing_file_name in missing_file_names:
            print("缺失文件:%s" % missing_file_name)

    
  

FTPHOST='ftp.ptree.jaxa.jp'

# create an instance of the downloadH8 class
h8_downloader = downloadH8('xxx', 'xxx')
## 2016 1440\0240   loss
# search for H8 files for a specific date
start_time = datetime.datetime(2023, 8, 27)
end_time = datetime.datetime(2023, 9,7,23, 59, 59)
file_list = h8_downloader.search_ahi8_l1_netcdf(start_time, end_time,pattern=['R21','02401_02401'])


# 选取每30分钟的数据文件名
selected_files = []
for file in file_list:
    if file.endswith(".nc"):
        if file[40:42] in ["00", "30"]:
            selected_files.append(file)

# 打印选取的文件名
print(selected_files)



check_data_completeness(selected_files,start_time, end_time)

from tqdm import tqdm 

for file in tqdm(selected_files):
    
    h8_downloader.download('/DatadiskExt/down_h8_code/', file)


使用nohup将脚本提交到后台,

nohup python down_kuihua8_30min.py  > down_H8-2023-08_09-15.log 2>&1 & 

并使用tail命令查看相关下载的日志:

 tail -f down_H8-2023-08_09-15.log 

可以发现数据正在后台下载

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1911503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端从入门到精通:第十二课: JS运算符及分支结构】

JavaScript运算符 算数运算符 关于自增自减运算 自增或者自减运算就是在本身的基础上进行1或者-1的操作 自增或者自减运算符可以在变量前也可以在变量后&#xff0c;但是意义不同 自增自减运算符如果在变量前&#xff0c;是先进行自增或者自减运算&#xff0c;在将变量给别人用…

基于springboot+vue实现的厨艺交流平台(文末源码+Lw)093

93基于SpringBootVue的实现的厨艺交流平台&#xff08;源码数据库万字Lun文流程图ER图结构图演示视频软件包&#xff09; 系统功能&#xff1a; 这次开发的厨艺交流平台功能有个人中心&#xff0c;食材分类管理&#xff0c;用户管理&#xff0c;菜品分类管理&#xff0c;菜谱信…

力扣第一题

1. 两数之和 提示 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可…

CSS技巧专栏:一日一例 2.纯CSS实现 多彩边框按钮特效

大家好,今天是 CSS技巧一日一例 专栏的第二篇《纯CSS实现多彩边框按钮特效》 先看图: 开工前的准备工作 正如昨日所讲,为了案例的表现,也处于书写的习惯,在今天的案例开工前,先把昨天的准备工作重做一遍。 清除浏览器的默认样式定义页面基本颜色设定body的样式清除butt…

深入理解 Qt 的 `moveToThread`:提升多线程应用性能的关键

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…

选择排序(C语言版)

选择排序是一种简单直观的排序算法 算法实现 首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列的末尾。 重复第二步&…

CTF php RCE (一)

0x01 引言 首先进入题目 应该是大部分都是一段白盒PHP审计&#xff0c;然后我们为了命令执行&#xff0c;绕过或者是钻空子等等操作&#xff0c;来拿到flag 0x02 基础 0x01 传参方式 这里有两个工具&#xff0c;hackbar和burpsuite,这两个工具非常实用 大家可以自己Googl…

Linux 利用命名空间创建一个自己的“容器“

Linux 利用命名空间创建一个自己的"容器" 前置条件 创建一个目录存放容器mkdir /myapp准备静态编译busybox&#xff0c;操作系统自带的往往是依赖动态库的(本文使用的debian apt install busybox-static) 开始 使用unshare起一个独立命名空间.# 进入后/myapp目录…

办公助手推荐✨

办公助手来啦&#xff01;✨ 办公助手来啦&#xff01;✨&#x1f31f; 主要亮点&#x1f4dd; 全新PDF编辑器&#x1f3a8; 丰富的幻灯片版式&#x1f30d; 改进的从右至左显示&#x1f310; 新增本地化选项 &#x1f4ca; 应用场景在线办公套件&#x1f4f1; 多平台支持&…

【YOLO8系列】(二)YOLOv8环境配置,手把手嘴对嘴保姆教学

目录 一. 准备环境 1.Anaconda下载 2.创建yolov8虚拟环境 3.pytorch安装 4.CUDA下载 5.CUDNN下载 二、yolov8模型下载 1.clone模型 2.pycharm配置 ①解释器配置 ②终端配置 3.安装必要库 4.下载训练模型 三、 环境验证 四、总结 YOLOv8 是 YOLO 系列最新的目标…

Springboot各个版本维护时间

Springboot各个版本维护时间

大话光学原理:1.“实体泛光说”、反射与折射

一、实体泛光说 在古希腊&#xff0c;那些喜好沉思的智者们中&#xff0c;曾流传着一个奇妙的设想&#xff1a;他们认为&#xff0c;我们的眼睛仿佛伸出无数触手般的光线&#xff0c;这些光线能向四面八方延伸&#xff0c;紧紧抓住周围的每一个物体。于是&#xff0c;当我们凝视…

Linux:进程间通信(二.共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)

Linux&#xff1a;进程间通信&#xff08;二.共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量&#xff09; 上次结束了进程间通信一&#xff1a;Linux&#xff1a;进程间通信&#xff08;一.初识进程间通信、匿名管道与命名管道、共享内存&#xff09; 文章目录 …

分布式IO模块软件配置

组态接口模块 1、打开网络视图 2、拖拽出ET200SP 3、双击ET200SP的图片&#xff0c;进入从站配置 总线适配器的组态更换 关于IO地址分配&#xff0c;需要建立好子网通信后&#xff0c;在主机上配置。 可以看到IP 和设备名 设备与控制器的Profinet连接 先找到设备名称再找…

H桥驱动器芯片详解

H桥驱动器芯片详解 上一篇文章讲解了H桥驱动器的控制原理&#xff0c;本文以汽车行业广泛应用的DRV8245芯片为例&#xff0c;详细讲解基于集成电路的H桥驱动器芯片。 1.概述 DRV824x-Q1系列器件是德州仪器&#xff08;TI&#xff09;的一款专为汽车应用设计的全集成H桥驱动器…

Linux——开发工具

1.yum yum是centos中的一个软件下载安装管理客户端&#xff0c;可以下载需要的软件或者解决依赖关系问题&#xff08;如动态库&#xff09;。程序都是来源于一段源代码&#xff0c;为了方便下载&#xff0c;源代码被提前在不同的环境下编译好生成对应的yum软件包&#xff0c;存…

微信小程序毕业设计-书店系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

自动群发消息插件常用源代码科普!

随着网络技术的快速发展&#xff0c;自动群发消息插件成为了众多企业和个人提高效率、加强沟通的重要工具。 然而&#xff0c;开发一个高效且稳定的自动群发消息插件并非易事&#xff0c;需要深入理解并熟练掌握相关的源代码。 本文将从五个方面&#xff0c;通过具体的源代码…

【Java】搜索引擎设计:信息搜索怎么避免大海捞针?

一、内容分析 我们准备开发一个针对全网内容的搜索引擎&#xff0c;产品名称为“Bingoo”。 Bingoo的主要技术挑战包括&#xff1a; 针对爬虫获取的海量数据&#xff0c;如何高效地进行数据管理&#xff1b;当用户输入搜索词的时候&#xff0c;如何快速查找包含搜索词的网页…

【代码随想录】【算法训练营】【第59天】 [卡码110]字符串接龙 [卡码105]有向图的完全可达性 [卡码106]岛屿的周长

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 59&#xff0c;周五&#xff0c;继续ding~ 题目详情 [卡码110] 字符串接龙 题目描述 卡码110 字符串接龙 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 […