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处理图片之PIL模块简单使用方法
May 11 Python
Python 自动刷博客浏览量实例代码
Jun 14 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
深入理解Python异常处理的哲学
Feb 01 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
详解Python 中sys.stdin.readline()的用法
Sep 12 Python
python支持多线程的爬虫实例
Dec 21 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
Python爬虫requests库多种用法实例
May 28 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
python如何实现word批量转HTML
Sep 30 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语句将数据库*.sql文件导入数据库
2014/05/05 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
2016/07/28 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
Vue路由前后端设计总结
2019/08/06 Javascript
js实现select下拉框选择
2020/01/11 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python列表(list)常用操作方法小结
2015/02/02 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
node中使用shell脚本的方法步骤
2021/03/23 Javascript
顶岗实习接收函
2014/01/09 职场文书
前台文员我鉴定
2014/01/12 职场文书
给同学的道歉信
2014/01/16 职场文书
运动会通讯稿200字
2014/02/16 职场文书
《将心比心》教学反思
2014/04/08 职场文书
团结演讲稿范文
2014/05/23 职场文书
校园运动会广播稿
2014/10/06 职场文书
股份转让协议书范本
2015/01/27 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
详解MySQL 联合查询优化机制
2021/05/10 MySQL
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python