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中的hypot()方法使用简介
May 18 Python
Python中在脚本中引用其他文件函数的实现方法
Jun 23 Python
mysql 之通过配置文件链接数据库
Aug 12 Python
详解python分布式进程
Oct 08 Python
python将字符串以utf-8格式保存在txt文件中的方法
Oct 30 Python
python 检查是否为中文字符串的方法
Dec 28 Python
Pycharm之快速定位到某行快捷键的方法
Jan 20 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
python网络编程socket实现服务端、客户端操作详解
Mar 24 Python
Python如何输出整数
Jun 07 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
Python 如何实现文件自动去重
Jun 02 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用数组返回无限分类的列表数据的代码
2010/08/08 PHP
一些php技巧与注意事项分析
2011/02/03 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
实践中学习AngularJS表单
2016/03/21 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
Python urlopen 使用小示例
2008/09/06 Python
python创建和删除目录的方法
2015/04/29 Python
Python3实现从指定路径查找文件的方法
2015/05/22 Python
浅析Python编写函数装饰器
2016/03/18 Python
Python表示矩阵的方法分析
2017/05/26 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
Python程序暂停的正常处理方法
2019/11/07 Python
python实现井字棋小游戏
2020/03/04 Python
Python 忽略文件名编码的方法
2020/08/01 Python
python中K-means算法基础知识点
2021/01/25 Python
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
期末考试复习计划
2015/01/19 职场文书
产品调价通知函
2015/04/20 职场文书
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS