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实现批量将word转html并将html内容发布至网站的方法
Jul 14 Python
详解python中asyncio模块
Mar 03 Python
python spyder中读取txt为图片的方法
Apr 27 Python
python中in在list和dict中查找效率的对比分析
May 04 Python
Python面向对象之继承和组合用法实例分析
Aug 27 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
Oct 17 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
基于python实现高速视频传输程序
May 05 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
Jan 18 Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 29 Python
Django调用支付宝接口代码实例详解
Apr 04 Python
基于python图书馆管理系统设计实例详解
Aug 05 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
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
PHP 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
基于JavaScript实现滑动门效果
2017/03/16 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
用Python实现随机森林算法的示例
2017/08/24 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
tensorflow识别自己手写数字
2018/03/14 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
详解Python字典小结
2018/10/20 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
2018/12/18 Python
Python中print和return的作用及区别解析
2019/05/05 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
亿企通软件测试面试题
2012/04/10 面试题
高一地理教学反思
2014/01/18 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
考勤制度通知
2015/04/25 职场文书
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript