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中的闭包和装饰器
Jun 12 Python
python函数的5种参数详解
Feb 24 Python
python实现稀疏矩阵示例代码
Jun 09 Python
机器学习python实战之手写数字识别
Nov 01 Python
从请求到响应过程中django都做了哪些处理
Aug 01 Python
解决win64 Python下安装PIL出错问题(图解)
Sep 03 Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
May 07 Python
python之生产者消费者模型实现详解
Jul 27 Python
Python实现动态循环输出文字功能
May 07 Python
一篇文章教你用python画动态爱心表白
Nov 22 Python
pytorch中index_select()的用法详解
Jan 06 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
TMDPHP 模板引擎使用教程
2012/03/13 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
解析link_mysql的php版
2013/06/30 PHP
PHP中常用的转义函数
2014/02/28 PHP
php生成RSS订阅的方法
2015/02/13 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
2019/05/09 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
原生JS简单实现ajax的方法示例
2016/11/29 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
Python实现简单拆分PDF文件的方法
2015/07/30 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
python中实现k-means聚类算法详解
2017/11/11 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
CSS3 边框效果
2019/11/04 HTML / CSS
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
一套.net面试题及答案
2016/11/02 面试题
个人欠款担保书
2014/05/20 职场文书
调任通知
2015/04/21 职场文书
导游词之吉林花园山
2019/10/17 职场文书
再谈python_tkinter弹出对话框创建
2022/03/20 Python
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers