Python FTP文件定时自动下载实现过程解析


Posted in Python onNovember 12, 2019

这篇文章主要介绍了Python FTP文件定时自动下载实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、需求:

某数据公司每日15:00~17:00之间,在其FTP发布当日数据供下载,我方需及时下载当日数据至指定本地目录。

二、分析:

1、需实现FTP登陆、查询、下载功能;

解答:使用内置的ftplib模块中FTP类;

2、需判断文件是否下载;

解答:使用os模块中path.exists方法;

3、需判断在指定时间段内才执行下载任务;

解答:使用内置的time模块抓取当前时间,并与指定时间做比较;

4、需考虑日期切换问题;

解答:使用内置的time模块抓取当前日期,并与变量中的日期做比较。

三、代码实现

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

'''
@Time  : 2019-11-11 13:30
@Author : Peanut_C
@FileName: ftp_auto_download.py
'''


import time
from ftplib import FTP
import os


remote_path = "/xxx/yy/z/" # 远端目录
begin_time = 1500 # 任务开始时间
end_time = 1700 # 任务结束时间


today = time.strftime("%Y%m%d") # 当天日期
today_file = today + 'test.txt' # 得到当天日期的目标文件名
remote_file = remote_path + today_file # 远端文件名
local_file = '\\\\local\\' + today + '\\' + today_file # 本地文件名
log_file = 'C:\\\\log\\ftp_log.txt'


def ftp_connect():
  """用于FTP连接"""
  ftp_server = 'w.x.y.z' # ftp站点对应的IP地址
  username = 'ftpuser' # 用户名
  password = 'ftppass' # 密码
  ftp = FTP()
  ftp.set_debuglevel(0) # 较高的级别方便排查问题
  ftp.connect(ftp_server, 21)
  ftp.login(username, password)
  return ftp

def remote_file_exists():
  """用于FTP站点目标文件存在检测"""
  ftp = ftp_connect()
  ftp.cwd(remote_path) # 进入目标目录
  remote_file_names = ftp.nlst() # 获取文件列表
  ftp.quit()
  if today_file in remote_file_names:
    return True
  else:
    return False

def download_file():
  """用于目标文件下载"""
  ftp = ftp_connect()
  bufsize = 1024
  fp = open(local_file, 'wb')
  ftp.set_debuglevel(0) # 较高的级别方便排查问题
  ftp.retrbinary('RETR ' + remote_file, fp.write, bufsize)
  fp.close()
  ftp.quit()


while True:
  if int(time.strftime("%H%M")) in range(begin_time, end_time): # 判断是否在执行时间范围
    if int(time.strftime("%Y%m%d")) - int(today) == 0: # 判断是否跨日期
      while not os.path.exists(local_file): # 判断本地是否已有文件
        if remote_file_exists(): # 判断远端是否已有文件
          download_file() 
          with open(log_file, 'a') as f:
            f.write('\n' + time.strftime("%Y/%m/%d %H:%M:%S") + " 今日文件已下载!")
          time.sleep(60) # 下载完毕静默1分钟
        else:
          time.sleep(180)
          break # 注意,此处跳出循环重新判断日期,避免周末或当天没文件时陷入内层循环
      else:
        time.sleep(180)
    else:
      """如果跨日期,则根据当前日期,更新各文件日期"""
      today = time.strftime("%Y%m%d") # 当天日期
      today_file = today + 'test.txt' # 得到当天日期的目标文件名
      remote_file = remote_path + today_file # 远端文件名
      local_file = '\\\\local\\' + today + '\\' + today_file # 本地文件名
      with open(log_file, 'a') as f:
        f.write('\n' + time.strftime("%Y/%m/%d %H:%M:%S") + " 任务启动, 文件日期已更新。")
  else:
    time.sleep(1800)

四、运行情况

保存为pyw文件,任务在后台持续运行,不需要计划任务,省心省力。

不用下载标记,一则较为简洁,二则本地文件如果被人误删或移动可自动重新下载。

日志中,每天仅写入任务启动和文件已下载标志,并记录对应时间,如有需要可再添加。

希望能帮到有需要的朋友。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
Dec 19 Python
查看python下OpenCV版本的方法
Aug 03 Python
python pygame实现2048游戏
Nov 20 Python
Pythony运维入门之Socket网络编程详解
Apr 15 Python
python程序快速缩进多行代码方法总结
Jun 23 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
python 伯努利分布详解
Feb 25 Python
pytorch查看模型weight与grad方式
Jun 24 Python
Selenium 配置启动项参数的方法
Dec 04 Python
Python爬取梨视频的示例
Jan 29 Python
golang中的空接口使用详解
Mar 30 Python
详解在python操作数据库中游标的使用方法
Nov 12 #Python
如何分离django中的媒体、静态文件和网页
Nov 12 #Python
pygame实现烟雨蒙蒙下彩虹雨
Nov 11 #Python
Python实现元素等待代码实例
Nov 11 #Python
如何基于python生成list的所有的子集
Nov 11 #Python
使用django和vue进行数据交互的方法步骤
Nov 11 #Python
如何使用python进行pdf文件分割
Nov 11 #Python
You might like
Oracle Faq(Oracle的版本)
2006/10/09 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
JS的Document属性和方法小结
2013/09/17 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
Vue.js第四天学习笔记(组件)
2016/12/02 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
vue百度地图 + 定位的详解
2019/05/13 Javascript
序列化模块json代码实例详解
2020/03/03 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
python 正则式 概述及常用字符
2009/05/07 Python
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
python获取本机mac地址和ip地址的方法
2015/04/29 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
Python实现的端口扫描功能示例
2018/04/08 Python
python中的json总结
2018/10/11 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
django 多数据库及分库实现方式
2020/04/01 Python
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
国际贸易专业个人求职信格式
2014/02/02 职场文书
硕士生找工作求职信
2014/07/05 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
初中家长评语和期望
2014/12/26 职场文书
委托收款证明
2015/06/23 职场文书
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
2021/03/29 Python