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画图学习入门教程
Jul 01 Python
Python 两个列表的差集、并集和交集实现代码
Sep 21 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
django admin组件使用方法详解
Jul 19 Python
Django Python 获取请求头信息Content-Range的方法
Aug 06 Python
Matplotlib scatter绘制散点图的方法实现
Jan 02 Python
Django单元测试中Fixtures用法详解
Feb 25 Python
Python sorted排序方法如何实现
Mar 31 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
对python中arange()和linspace()的区别说明
May 03 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 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中操作ini配置文件的方法
2013/04/25 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
struts2+jquery+json实现异步加载数据(自写)
2013/06/24 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
Angularjs 创建可复用组件实例代码
2016/10/09 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
微信小程序用canvas画图并分享
2020/03/09 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
python3爬取torrent种子链接实例
2020/01/16 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
你常见到的runtime exception
2016/09/05 面试题
优秀班集体先进事迹材料
2014/05/28 职场文书
电子专业自荐信
2014/07/01 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
清洁工岗位职责
2015/02/13 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
贫困生证明范文
2015/06/16 职场文书
情况说明书格式及范文
2019/06/24 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
vscode内网访问服务器的方法
2022/06/28 Servers