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中操作字典之clear()方法的使用
May 21 Python
python 与GO中操作slice,list的方式实例代码
Mar 20 Python
关于Django外键赋值问题详解
Aug 13 Python
python 日志增量抓取实现方法
Apr 28 Python
python 识别图片中的文字信息方法
May 10 Python
对Python 3.2 迭代器的next函数实例讲解
Oct 18 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
Django自带的加密算法及加密模块详解
Dec 03 Python
python从内存地址上加载python对象过程详解
Jan 08 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
Python实现一个论文下载器的过程
Jan 18 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 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
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
CI框架的安全性分析
2016/05/18 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
PHP学习笔记之session
2018/05/06 PHP
javascript dom 操作详解 js加强
2009/07/13 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
js中的DOM模拟购物车功能
2017/03/22 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
Python中的推导式使用详解
2015/06/03 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
Python如何快速实现分布式任务
2017/07/06 Python
Python3 Tkinter选择路径功能的实现方法
2019/06/14 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
乡镇计划生育工作汇报
2014/10/28 职场文书
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js