python_定时任务自动匹配数据II

从配置文件读取配置参数,并每天定时执行日常任务、每周一定时执行周任务,匹配符合要求的org数据,文件查找-复制-合并-裁剪。

import os
import re
import shutil
import threading
import datetime
import timeimport schedule# 全局变量:配置文件
glob_config = "config_nrtk.txt"def txt_to_dict(filename):with open(filename, 'r', encoding='UTF-8-sig') as f: # 读取的文件或者写入文件时会出现”\ufeff”非法字符,需要改变编码方式‘UTF-8‘为‘UTF-8-sig‘data_dict = {}for line in f:# 忽略空行和注释行if line.strip() == '' or line.startswith('#'):continuekey, value = line.strip().split('=')data_dict[key] = valuereturn data_dictdef date_to_th(date_t):# 获取今年的第一天first_day = datetime.date(date_t.year, 1, 1)# 计算当前天是今年的第几天day_of_year = (date_t - first_day).days + 1# 获取当前天的月份month = date_t.month# 将月份转换为英文,保留3个字符month_name = ["Unknown", "January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December"][month][:3]print("当前天是{}月。".format(month_name))print("当前天是今年的第{}天。".format(day_of_year))return day_of_year, month_namedef copy_exchange(src_path, dst_path, dt, pattern_start="120000.00", pattern_end="235959.00"):# 文件命名now = datetime.datetime.now()fn = re.sub(r'-', '', dt)pp = pattern_start.split(".")fnn = pp[0]# 区分不同环境的pos文件if "NRTK_PROD" in src_path:print("PROD环境的NRTK文件")file_name = "NRTK_PROD_" + fn + '_' + fnn + now.strftime('_%H%M%S') + '.org'# elif "PROD_V2" in src_path:#     print("PROD_V2环境的SSR文件")#     file_name = "PROD_" + fn + '_' + fnn + now.strftime('_%H%M%S') + '.pos'# elif "TEST_V2_P" in src_path:#     print("TEST_V2_P环境的SSR文件")#     file_name = "TEST_P_" + fn + '_' + fnn + now.strftime('_%H%M%S') + '.pos'# elif "TEST_V2" in src_path:#     print("TEST_V2环境的SSR文件")#     file_name = "TEST_" + fn + '_' + fnn + now.strftime('_%H%M%S') + '.pos'else:print("非PROD和TEST环境的SSR文件")file_name = fn + '_' + fnn + now.strftime('_%H%M%S') + '.org'# 复制文件dst_path_c = os.path.join(dst_path, file_name)shutil.copy2(src_path, dst_path_c)# 写入目标文件dst_w_path = os.path.join(dst_path, 'N_' + file_name)with open(dst_path_c, 'r') as dst, open(dst_w_path, 'w') as dst_w:# 默认不写入文件writing = Falsenum_count = 0for line in dst:# 正则匹配,起始行if re.search(pattern_start, line) and line.startswith('$GPZDA'):writing = Trueif writing:num_count += 1dst_w.write(line)# 正则匹配,截止行if re.search(pattern_end, line):  # and line.startswith('$GPGGA'):writing = False# breakif num_count == 0:print(r'当前时间:%s,没有数据匹配' % (now.strftime('%Y-%m-%d %H:%M:%S')))else:print(r'当前时间:%s,总共%s行写入完成,起始于:%s,截止于:%s' % (now.strftime('%Y-%m-%d %H:%M:%S'), num_count, pattern_start, pattern_end))if dst_path_c:os.remove(dst_path_c)def nrtk_daily_job():# 获取今天的日期today = datetime.date.today()# 获取昨天的日期yesterday = today - datetime.timedelta(days=1)# print("昨天的日期是:", yesterday)day_y, month_y = date_to_th(yesterday)# 读取配置文件,加载字典data = txt_to_dict(glob_config)# 获取特定键值对的值origin_dir = data.get('origin_dir', 'null')backup_dir = data.get('backup_dir', 'null')file_prefix_prod_nrtk = data.get('file_prefix_prod_nrtk', 'null')# 拼接完整的org文件名称file_name = file_prefix_prod_nrtk + str(day_y * 10) + ".org"# 拼接读取的文件路径origin_dir_all = os.path.join(origin_dir, month_y, file_name)# 拼接昨天的起始和截止关键字day_y_format = time_exchange(str(yesterday))pattern_start_y = "120000.00," + str(day_y_format)day_y_format = time_exchange(str(yesterday))pattern_end_y = "235959.00," + str(day_y_format)if origin_dir_all:copy_exchange(origin_dir_all, backup_dir, str(yesterday), pattern_start_y, pattern_end_y)else:print(r'当前时间:%s,%s文件不存在' % (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), origin_dir_all))def nrtk_weekly_job():# 获取今天的日期today = datetime.date.today()# 获取今天的偏移量idx = (today.weekday() + 1) % 7  # MON = 0, SUN = 6 -> SUN = 0 .. SAT = 6# 获取上周五、六、日的日期fri = today - datetime.timedelta(idx + 2)sun = today - datetime.timedelta(idx + 1)sat = today - datetime.timedelta(idx)# print(fri, sun, sat)day_fri, month_fri = date_to_th(fri)day_sun, month_sun = date_to_th(sun)day_sat, month_sat = date_to_th(sat)# 读取配置文件,加载字典data = txt_to_dict(glob_config)# 获取特定键值对的值origin_dir = data.get('origin_dir', 'null')backup_dir = data.get('backup_dir', 'null')file_prefix_prod_nrtk = data.get('file_prefix_prod_nrtk', 'null')# 拼接完整的org文件名称file_name_fri = file_prefix_prod_nrtk + str(day_fri * 10) + ".org"origin_dir_all_fri = os.path.join(origin_dir, month_fri, file_name_fri)file_name_sun = file_prefix_prod_nrtk + str(day_sun * 10) + ".org"origin_dir_all_sun = os.path.join(origin_dir, month_sun, file_name_sun)file_name_sat = file_prefix_prod_nrtk + str(day_sat * 10) + ".org"origin_dir_all_sat = os.path.join(origin_dir, month_sat, file_name_sat)# print(origin_dir_all_fri, origin_dir_all_sun, origin_dir_all_sat)try:# 合并文件output_file = os.path.join(backup_dir, file_prefix_prod_nrtk + "_merge.org")merge_file = merge_files(origin_dir_all_fri, origin_dir_all_sun, origin_dir_all_sat, output_file)# 拼接周六的起始和截止关键字day_fri_format = time_exchange(str(fri))pattern_start_sun = "160000.00," + str(day_fri_format)day_sun_format = time_exchange(str(sun))pattern_end_sun = "155959.00," + str(day_sun_format)# 拼接周日的起始和截止关键字# day_sun_format = time_exchange(str(sun))pattern_start_sat = "160000.00," + str(day_sun_format)day_sat_format = time_exchange(str(sat))pattern_end_sat = "155959.00," + str(day_sat_format)copy_exchange(merge_file, backup_dir, str(sun), pattern_start_sun, pattern_end_sun)time.sleep(5)copy_exchange(merge_file, backup_dir, str(sat), pattern_start_sat, pattern_end_sat)if merge_file:os.remove(merge_file)except Exception as e:print(e)def time_exchange(date_str):# YYYY-MM-DD格式转换成DD,MM,YYYYdate_obj = datetime.datetime.strptime(date_str, "%Y-%m-%d")formatted_date = date_obj.strftime("%d,%m,%Y")return formatted_datedef merge_files(file1, file2, file3, output_file):with open(output_file, 'w') as outfile:with open(file1) as infile1:outfile.write(infile1.read())with open(file2) as infile2:outfile.write(infile2.read())with open(file3) as infile3:outfile.write(infile3.read())return output_filedef run_threading(job_func):# 多线程并行运行job_thread = threading.Thread(target=job_func)job_thread.start()if __name__ == '__main__':# 读取配置文件,加载字典data = txt_to_dict(glob_config)# 获取运行时间run_time_daily = data.get('run_time_daily', '08:05')run_time_weekly = data.get('run_time_weekly', '00:05')# 创建日常任务调度器schedule_daily = schedule.Scheduler()# 每天定时调度日常任务schedule_daily.every().day.at(run_time_daily).do(run_threading, nrtk_daily_job)# schedule.every(2).minutes.do(run_threading, job_test)  # 每两分钟# schedule.every(2).minutes.do(run_threading, job_prod)  # 每两分钟# 创建周任务调度器schedule_weekly = schedule.Scheduler()# 每周的星期一定时调度周任务schedule_weekly.every().monday.at(run_time_weekly).do(run_threading, nrtk_weekly_job)# 立即执行所有任务schedule_daily.run_all()schedule_weekly.run_all()while True:schedule_daily.run_pending()schedule_weekly.run_pending()time.sleep(1)

config配置文件:

# 日常任务执行时间-北京时间(格式:小时:分钟)
run_time_daily=08:05# 周任务执行时间-北京时间(每周一定时执行)
run_time_weekly=00:05# 读取org文件的外层目录
origin_dir=E:\data\RefData.23# 读取org文件的文件名前缀
file_prefix_prod_nrtk=GGA_NRTK_PROD_Incoming_
file_prefix_prod_s2o=GGA_S2O_PROD_Incoming_
file_prefix_test_s2o=GGA_S2O_TEST_Incoming_# 备份文件的路径
backup_dir=E:\data\RefData.23\备份

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

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

相关文章

php+vue3实现点选验证码

buildadmin 中的点选验证码实现 验证码类 <?phpnamespace ba;use Throwable; use think\facade\Db; use think\facade\Lang; use think\facade\Config;/*** 点选文字验证码类*/ class ClickCaptcha {/*** 验证码过期时间(s)* var int*/private int $expire 600;/*** 可以…

我记不住的那些命令(不断更新中)

fzf 一种进行模糊查找的命令行工具 主页&#xff1a;https://github.com/junegunn/fzf 我的主机是 Kali&#xff0c;通过apt进行安装fzf&#xff0c;并进行配置。 # apt install fzf # apt show fzf 通过参考/usr/share/doc/fzf/README.Debian来进行快速配置快捷键和自动补…

保护您的Google账号安全:检查和加固措施

简介&#xff1a;随着我们在日常生活中越来越依赖于Google账号&#xff0c;我们的个人信息和敏感数据也变得越来越容易受到威胁。为了确保您的Google账号的安全性&#xff0c;本文将介绍一些简单但有效的方法&#xff0c;帮助您检查和加固您的Google账号。 --- 在数字时代&am…

squid代理服务器

squide是正向代理&#xff0c;缓存加速。基于aci访问控制协议。可以过滤控制。可以实现访问控制 squid代理的工作机制 nginx是转发 1、 squid是代替客户端向网站请求数据&#xff0c;不需要访问代理的ip地址。直接请求目的网站即可。由代理服务器处理请求和响应。squid也可以…

Linux 应用服务

Part I: Linux 系统概述 什么是 LinuxLinux 的历史和版本Linux 发行版介绍Linux 的优缺点 Part II: Linux 安装与配置 5. 硬件要求与准备工作 6. 安装 Linux 操作系统 7. Linux 系统初始化设置 8. Linux 系统更新与升级 9. Linux 基础配置 Part III: Linux 命令行 10. Linux…

关于前端地图笔记

坐标系 地球坐标系——WGS84&#xff1a;常见于 GPS 设备&#xff0c;Google 地图等国际标准的坐标体系。火星坐标系——GCJ-02&#xff1a;中国国内使用的被强制加密后的坐标体系&#xff0c;高德坐标、腾讯地图。百度坐标系——BD-09&#xff1a;百度地图所使用的坐标体系&a…

如何创建NTP Server给本地局域网用

安装NTP Server sudo apt-get install ntp配置conf文件 sudo vimd /etc/ntp.conf# 允许本地网络的客户端访问&#xff0c;但是不允许本地机器修改server的时间 restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap启动服务 sudo service ntp start你可以使用以下命令来检…

[Mac软件]Adobe Media Encoder 2024 V24.0.2免激活版

软件说明 使用Media Encoder&#xff0c;您将能够处理和管理多媒体。插入、转码、创建代理版本&#xff0c;并几乎以任何可用的格式输出。在应用程序中以单一方式使用多媒体&#xff0c;包括Premiere Pro、After Effects和Audition。 紧密整合 与Adobe Premiere Pro、After …

WebRTC简介及使用

文章目录 前言一、WebRTC 简介1、webrtc 是什么2、webrtc 可以做什么3、数据传输需要些什么4、SDP 协议5、STUN6、TURN7、ICE 二、WebRTC 整体框架三、WebRTC 功能模块1、视频相关①、视频采集---video_capture②、视频编解码---video_coding③、视频加密---video_engine_encry…

保护数字前沿:下一代防火墙如何塑造网络安全的未来

下一代防火墙通过提供先进的威胁检测、精细控制和云安全功能&#xff0c;正在重塑网络安全的未来。随着数字环境的不断发展&#xff0c;组织必须采用这些创新解决方案来保护其数字资产并维护安全的数字前沿。 在当今互联的世界中&#xff0c;网络威胁变得越来越复杂&#xff0c…

安全认证 | CISP和CISSP区别是什么?考哪个好?

随着信息安全愈发受到重视&#xff0c;信息安全领域的证书也越来越多&#xff0c;其中比较权威的如CISP和CISSP证书是不少人的选择。 那么这两者之间到底有什么区别&#xff1f;究竟考哪个会比较好呢&#xff1f; 01 CISP是什么 CISP指的是注册信息安全专业人员&#xff0c;系…

阿里云ACK(Serverless)安装APISIX网关及APISIX Ingress Controller

在k8s上安装apisix全家&#xff0c;通过helm安装很简单&#xff0c;但是会遇到一些问题。 安装 首先登录阿里云控制台&#xff0c;在ACK集群详情页&#xff0c;进入CloudShell&#xff0c;执行下面helm命令安装apisix、apisix-ectd、apisix-dashboard和apisix-ingress-contro…

第1关:构造函数与析构函数的实现

题目&#xff1a;根据.h写出.cpp 考点&#xff1a; 1.链表的默认构造&#xff0c; 拷贝构造&#xff0c;传参构造以及析构函数等。 代码&#xff1a; /********** BEGIN **********/ #include <cstdlib> #include <cstring> #include "LinkedList.h&…

ARM PMU

PMU单元概览 ARM PMU概要 PMU作为一个扩展功能&#xff0c;是一种非侵入式的调试组件。 对PMU寄存器的访问可以通过CP15协处理器指令和Memory-Mapped地址。 基于PMUv2架构&#xff0c;A7处理器在运行时可以收集关于处理器和内存的各种统计信息。对于处理器来说这些统计信息中…

【中间件】ElasticSearch:ES的基本概念与基本使用

ElasticSearch ElasticSearch基本概念 Index索引、Type类型&#xff0c;类似于数据库中的数据库和表&#xff0c;我们说&#xff0c;ES的数据存储在某个索引的某个类型中&#xff08;某个数据库的某个表中&#xff09;&#xff0c;Document文档&#xff08;JSON格式&#xff…

AI:83-基于深度学习的手势识别与实时控制

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…

Zookeeper篇---第十二篇

系列文章目录 文章目录 系列文章目录一、说说 Zookeeper 的 CAP 问题上做的取舍?二、watch 监听为什么是一次性的?一、说说 Zookeeper 的 CAP 问题上做的取舍? 一致性 C:Zookeeper 是强一致性系统,为了保证较强的可用性,“一半以上成功即成功”的数据同 步方式可能会导致…

CSDN每日一题学习训练——Java版(分数到小数、罗马数字转整数、x 的平方根)

版本说明 当前版本号[20231114]。 版本修改说明20231114初版 目录 文章目录 版本说明目录分数到小数题目解题思路代码思路参考代码 罗马数字转整数题目解题思路代码思路参考代码 x 的平方根题目解题思路代码思路参考代码 分数到小数 题目 给定两个整数&#xff0c;分别表示…

【Linux奇遇记】我和Linux的初次相遇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:Linux奇遇记系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 前端和后端的介绍 1.前端 2.后端 3.前后端区别 Linux在前后端开发中的角色 如何学习Linux 去进行程序开发 Linux的常见根目…