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提取字典key列表的方法
Jul 11 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
Feb 18 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
解决DataFrame排序sort的问题
Jun 07 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
pytorch中的自定义数据处理详解
Jan 06 Python
python读取mysql数据绘制条形图
Mar 25 Python
套娃式文件夹如何通过Python批量处理
Aug 23 Python
matplotlib实现数据实时刷新的示例代码
Jan 05 Python
如何用python识别滑块验证码中的缺口
Apr 01 Python
python+opencv实现视频抽帧示例代码
Jun 11 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
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
PHP的博客ping服务代码
2012/02/04 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
Bootstrap每天必学之面板
2015/11/30 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
python回溯法实现数组全排列输出实例分析
2015/03/17 Python
浅谈五大Python Web框架
2017/03/20 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
2017/08/31 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
光盘行动倡议书
2014/02/02 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
教师先进个人材料
2014/12/17 职场文书
致接力运动员加油稿
2015/07/21 职场文书
班主任寄语2016
2015/12/04 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python