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编写一个简单的tic-tac-toe游戏的教程
Apr 16 Python
python动态性强类型用法实例
May 09 Python
Python素数检测的方法
May 11 Python
浅谈Tensorflow模型的保存与恢复加载
Apr 26 Python
python3.4控制用户输入与输出的方法
Oct 17 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
python实现列表中最大最小值输出的示例
Jul 09 Python
django实现支付宝支付实例讲解
Oct 17 Python
Python udp网络程序实现发送、接收数据功能示例
Dec 09 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
Jan 10 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
Python列表推导式实现代码实例
Sep 09 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实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
php 中文和编码判断代码
2010/05/16 PHP
浅析51个PHP处理字符串的函数
2013/08/02 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
js技巧--转义符"\"的妙用
2007/01/09 Javascript
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
详解Node.JS模块 process
2020/08/31 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
Python线程创建和终止实例代码
2018/01/20 Python
python进行两个表格对比的方法
2018/06/27 Python
python对文件的操作方法汇总
2020/02/28 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
大学生工作推荐信范文
2013/12/02 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
公司年夜饭通知
2015/04/25 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python
Python 键盘事件详解
2021/11/11 Python
Python可视化学习之seaborn调色盘
2022/02/24 Python
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js
Python创建SQL数据库流程逐步讲解
2022/09/23 Python