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基础教程之内置函数locals()和globals()用法分析
Mar 16 Python
简单了解python PEP的一些知识
Jul 13 Python
Flask框架钩子函数功能与用法分析
Aug 02 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
在django模板中实现超链接配置
Aug 21 Python
python学生信息管理系统实现代码
Dec 17 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
python引入其他文件夹下的py文件具体方法
May 23 Python
Python列表的索引与切片
Apr 07 Python
python开发人人对战的五子棋小游戏
May 02 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 foreach 使用&(与运算符)引用赋值要注意的问题
2010/02/16 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
javascript得到当前页的来路即前一页地址的方法
2014/02/18 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
2016/08/03 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
JS实现滚动条触底加载更多
2019/09/19 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
Python中删除文件的程序代码
2011/03/13 Python
python生成指定尺寸缩略图的示例
2014/05/07 Python
python爬虫之百度API调用方法
2017/06/11 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
计算机网络毕业生自荐信
2013/10/01 职场文书
写给老婆的检讨书
2014/02/21 职场文书
后勤部经理岗位职责
2014/02/23 职场文书
娱乐节目策划方案
2014/06/10 职场文书
文明单位创建材料
2014/12/24 职场文书
十佳少年事迹材料
2014/12/25 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
同学会感言
2015/07/30 职场文书
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript