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之用Python计算
Sep 12 Python
python实现登陆知乎获得个人收藏并保存为word文件
Mar 16 Python
python标准算法实现数组全排列的方法
Mar 17 Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 Python
Python中进程和线程的区别详解
Oct 29 Python
Django实现支付宝付款和微信支付的示例代码
Jul 25 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
Python 切分数组实例解析
Nov 07 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 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中处理模拟rewrite 效果
2006/12/09 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
实例解析php的数据类型
2018/10/24 PHP
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
node跨域请求方法小结
2017/08/25 Javascript
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
2017/10/24 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
微信小程序实现canvas分享朋友圈海报
2020/06/21 Javascript
跟老齐学Python之做一个小游戏
2014/09/28 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
Python算法应用实战之队列详解
2017/02/04 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
2019/03/11 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
初中家长寄语
2014/04/02 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
党员违纪检讨书
2015/05/05 职场文书
小学教师读书笔记
2015/07/01 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
Python Flask实现进度条
2022/05/11 Python