Python实现FTP文件定时自动下载的步骤


Posted in Python onDecember 19, 2020

之前遇到技术问题总能在技术博客上得到启发,十分感谢各位的无私分享。而自己却很少发文,固然是水平有限,但也限制了知识积累和总结。今后多总结分享,回馈博客的同时也希望大家多多批评。

一、需求:

某数据公司每日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实现FTP文件定时自动下载的步骤的详细内容,更多关于python ftp文件定时下载的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
新手该如何学python怎么学好python?
Oct 07 Python
Python解惑之整数比较详解
Apr 24 Python
python中安装Scrapy模块依赖包汇总
Jul 02 Python
Python数字图像处理之霍夫线变换实现详解
Jan 12 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
python字符串Intern机制详解
Jul 01 Python
详解Django定时任务模块设计与实践
Jul 24 Python
python tkinter canvas使用实例
Nov 04 Python
tensorboard实现同时显示训练曲线和测试曲线
Jan 21 Python
python中提高pip install速度
Feb 14 Python
Python中快速掌握Data Frame的常用操作
Mar 31 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Jun 21 Python
Python+Xlwings 删除Excel的行和列
Dec 19 #Python
python Zmail模块简介与使用示例
Dec 19 #Python
python中实现栈的三种方法
Dec 19 #Python
python中实现词云图的示例
Dec 19 #Python
python 实现图片批量压缩的示例
Dec 18 #Python
python 基于opencv实现高斯平滑
Dec 18 #Python
python爬取代理ip的示例
Dec 18 #Python
You might like
php中的常用魔术方法总结
2013/08/02 PHP
Symfony生成二维码的方法
2016/02/04 PHP
Javascript 篱式条件判断
2008/08/22 Javascript
javascript 写类方式之七
2009/07/05 Javascript
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
jquery 经典动画菜单效果代码
2010/01/26 Javascript
Jquery ui css framework
2010/06/28 Javascript
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
JS仿Base.js实现的继承示例
2017/04/07 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
Python的UTC时间转换讲解
2019/02/26 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
Photobook澳大利亚:制作相片书,婚礼卡,旅行相簿
2017/01/12 全球购物
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
初中三年学生的学习自我评价
2013/11/13 职场文书
毕业生自我鉴定
2013/12/04 职场文书
机电工程学生自荐信范文
2013/12/07 职场文书
青年教师典范事迹材料
2014/01/31 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python