python实现文件下载功能(Linux+Windows本地)
一、前提介绍
我的日常工作中,有一项固定的工作内容,就是需要从不同的服务器上将各个应用系统的数据库备份拉到本地。由于此项工作太过于机械化,占用时间较多,在经历了一段时间的折磨之后,我就开始尝试使用脚本来完成这项工作。
我的备份介质存在比较严重的日期依赖,例如正常情况,T日备份T-1的备份文件,但是当T日为星期一时,有的需要拉上周五至上周日的数据,有的只需要拉上周五的数据等,遇到节假日就更麻烦了。原本考虑使用bat脚本实现,后来分析了一下,觉得可行性太低,决定采用python来实现。
开始的时候,由于服务器环境比较老,并且是生产的内网环境,我不想去折腾一个新的环境,所以我想直接使用服务器本身的环境,Windows+python2.7+pscp来完成,做完之后发现拷贝数据太慢,1M下载速度不到,无奈才使用python的paramiko模块进行优化。
二、代码实现
实现目标:
①方便维护
②从远程拷贝备份介质到本地;
②拷贝备份介质的日期为上一工作日至当日;
③自动生成本地路径文件夹,文件夹所含的日期为下个月第一个工作日
以上,经过简单分析之后,第一,我需要将所有需要配置的数据写进配置文件,第二,解决日期问题,第三,解决路径问题
2.1配置文件
2.1.1日常维护
首先为了保证以后的维护问题,将往后需要修改数据的部分配置在单独的文件中,我配置的数据有holiday_list(节假日)、linux_address(远程路径)、windows_address(本地路径)、file_name(模糊文件名)、file_extension(文件后缀)。配置的数据使用列表存储,方便遍历套接形成远程路径和本地路径。
2.1.2日期问题
(1)需要获取上一工作日至当日的所有日期
# 获取日期列表(上一工作日至系统日期)----------------------------------------------
def get_date_list():
date_list = []
today = datetime.datetime.today().strftime("%Y%m%d")
today_date = datetime.datetime.strptime(today, "%Y%m%d")
last_day_get = get_last_work_day()
last_day_date = datetime.datetime.strptime(last_day_get, "%Y%m%d")
while today_date >= last_day_date:
last_day = last_day_date.strftime("%Y%m%d")
date_list.append(last_day)
last_day_date += datetime.timedelta(days=1)
return date_list
# 获取today最近一个工作日--------------------------------------------------------
def get_last_work_day():
i = 1
# 前一自然日
last_day = datetime.date(datetime.datetime.today().year, datetime.datetime.today().month,
datetime.datetime.today().day) - datetime.timedelta(i)
# 前一自然日的星期数
calendar_march = calendar.weekday(last_day.year, last_day.month, last_day.day)
# 格式化日期
last_day_to_str = last_day.strftime("%Y%m%d")
while last_day_to_str in holiday_list or calendar_march in range(5, 7):
i += 1
last_day = datetime.date(datetime.datetime.today().year, datetime.datetime.today().month,
datetime.datetime.today().day) - datetime.timedelta(i)
# 前一自然日的星期数
calendar_march = calendar.weekday(last_day.year, last_day.month, last_day.day)
# 格式化日期
last_day_to_str = last_day.strftime("%Y%m%d")