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中的__SLOTS__属性使用示例
Feb 18 Python
Python 装饰器深入理解
Mar 16 Python
NumPy 如何生成多维数组的方法
Feb 05 Python
基于python 处理中文路径的终极解决方法
Apr 12 Python
PyCharm在新窗口打开项目的方法
Jan 17 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
Python3几个常见问题的处理方法
Feb 26 Python
Python Django的安装配置教程图文详解
Jul 17 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
python 计算方位角实例(根据两点的坐标计算)
Jan 17 Python
python在协程中增加任务实例操作
Feb 28 Python
python 实现的截屏工具
May 08 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
php URL跳转代码 减少外链
2011/06/25 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
不错的一个日期输入 动态
2006/11/06 Javascript
javascript动画效果类封装代码
2007/08/28 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
python将一个英文语句以单词为单位逆序排放的方法
2018/12/20 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
中学教师自我鉴定
2014/02/07 职场文书
生物制药专业求职信
2014/03/11 职场文书
四议两公开实施方案
2014/03/28 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
优秀班主任申报材料
2014/12/16 职场文书
新手初学Java List 接口
2021/07/07 Java/Android