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 详解基本语法_函数_返回值
Jan 22 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
Nov 21 Python
使用PyInstaller将python转成可执行文件exe笔记
May 26 Python
解决django前后端分离csrf验证的问题
Feb 03 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
May 10 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 Python
Python语言异常处理测试过程解析
Jan 08 Python
Django admin管理工具TabularInline类用法详解
May 14 Python
python request 模块详细介绍
Nov 10 Python
详解python3 GUI刷屏器(附源码)
Feb 18 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
短波问题解答
2021/02/28 无线电
php使用cookie显示用户上次访问网站日期的方法
2015/01/26 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
JS编程小常识很有用
2012/11/26 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
详解JavaScript自定义函数
2020/07/29 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python的Django中django-userena组件的简单使用教程
2015/05/30 Python
Django Admin 实现外键过滤的方法
2017/09/29 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
python实现五子棋小游戏
2020/03/25 Python
python仿抖音表白神器
2019/04/08 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
深入浅析python变量加逗号,的含义
2020/02/22 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
Python计算矩阵的和积的实例详解
2020/09/10 Python
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
2014年社区党建工作汇报材料
2014/11/02 职场文书
个人廉洁自律总结
2015/03/06 职场文书
退休教师追悼词
2015/06/23 职场文书
工程进度款催款函
2015/06/24 职场文书
茶花女读书笔记
2015/06/29 职场文书
六五普法学习心得体会
2016/01/21 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python