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中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
从Python程序中访问Java类的简单示例
Apr 20 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
Mar 20 Python
Pyinstaller将py打包成exe的实例
Mar 31 Python
20行python代码的入门级小游戏的详解
May 05 Python
Python缓存技术实现过程详解
Sep 25 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
Mar 18 Python
Python3 webservice接口测试代码详解
Jun 23 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
Jun 23 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 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
多文件上载系统完整版
2006/10/09 PHP
Zend公司全球首推PHP认证
2006/10/09 PHP
PHP批量生成静态HTML的简单原理和方法
2014/04/20 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
JS中的多态实例详解
2017/10/15 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
详解Python中的__new__()方法的使用
2015/04/09 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
文秘大学生求职信
2014/02/25 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
5分钟教你docker安装启动redis全教程(全新方式)
2021/05/29 Redis
vue实现列表垂直无缝滚动
2022/04/08 Vue.js
vmware虚拟机打不开vmx文件怎么办 ?vmware虚拟机vmx文件打开方法
2022/04/08 数码科技