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单例模式实例分析
Jan 14 Python
在Python中使用next()方法操作文件的教程
May 24 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
Jan 07 Python
python中json格式数据输出的简单实现方法
Oct 31 Python
Python查找两个有序列表中位数的方法【基于归并算法】
Apr 20 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
pandas把所有大于0的数设置为1的方法
Jan 26 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
tensorflow对图像进行拼接的例子
Feb 05 Python
Python远程方法调用实现过程解析
Jul 28 Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 Python
python中K-means算法基础知识点
Jan 25 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
一个分页的论坛
2006/10/09 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
JS中判断null、undefined与NaN的方法
2014/03/24 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
2014/09/17 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
对python生成业务报表的实例详解
2019/02/03 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
Django操作session 的方法
2020/03/09 Python
如何理解python中数字列表
2020/05/29 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
即将毕业大学生自荐信
2014/01/24 职场文书
3.12植树节活动总结2014
2014/03/13 职场文书
大学生村官考核材料
2014/05/23 职场文书
电话营销开场白
2015/05/29 职场文书
暑期工社会实践报告
2015/07/13 职场文书
运动会广播稿50字
2015/08/19 职场文书