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利用lxml读写xml格式的文件
Aug 10 Python
对python中Json与object转化的方法详解
Dec 31 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
django 装饰器 检测登录状态操作
Jul 02 Python
python 制作python包,封装成可用模块教程
Jul 13 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
Aug 07 Python
python给list排序的简单方法
Dec 10 Python
分享提高 Python 代码的可读性的技巧
Mar 03 Python
分享Python获取本机IP地址的几种方法
Mar 17 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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
php实现每日签到功能
2018/11/29 PHP
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
用unescape反编码得出汉字示例
2014/04/24 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
angularJS1 url中携带参数的获取方法
2018/10/09 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
redux.js详解及基本使用
2019/05/24 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
python实现代码行数统计示例分享
2014/02/10 Python
python中元类用法实例
2014/10/10 Python
Python将xml和xsl转换为html的方法
2015/03/10 Python
Python素数检测的方法
2015/05/11 Python
简介Django框架中可使用的各类缓存
2015/07/23 Python
python操作mysql数据库
2017/03/05 Python
python处理csv中的空值方法
2018/06/22 Python
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
体育专业个人求职信范文
2013/12/27 职场文书
抵押贷款承诺书
2014/05/30 职场文书
学习张林森心得体会
2014/09/10 职场文书
解除租房协议书
2014/12/03 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
python 模拟在天空中放风筝的示例代码
2021/04/21 Python