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实现ipsec开权限实例
Nov 11 Python
Python fileinput模块使用介绍
Nov 30 Python
python入门之语句(if语句、while语句、for语句)
Jan 19 Python
Python中for循环控制语句用法实例
Jun 02 Python
简析Python的闭包和装饰器
Feb 26 Python
wxPython的安装图文教程(Windows)
Dec 28 Python
python ddt实现数据驱动
Mar 14 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
Python中使用logging和traceback模块记录日志和跟踪异常
Apr 09 Python
PyQt5组件读取参数的实例
Jun 25 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
Nov 29 Python
Python自动化之批量处理工作簿和工作表
Jun 03 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
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
2010/06/04 PHP
php中使用临时表查询数据的一个例子
2013/02/03 PHP
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
为你总结一些php信息函数
2015/10/21 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
jquery鼠标滑过提示title具体实现代码
2013/08/06 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
2015/03/27 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
详解如何运行vue项目
2019/04/15 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
Python中itertools模块用法详解
2014/09/25 Python
python web框架学习笔记
2016/05/03 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
python中int与str互转方法
2018/07/02 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
python关于倒排列的知识点总结
2020/10/13 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
日语专业毕业生求职信
2013/12/04 职场文书
大课间活动实施方案
2014/03/06 职场文书
幼儿园秋游感想
2014/03/12 职场文书
元宵节晚会主持人串词
2014/03/25 职场文书
避暑山庄导游词
2015/02/04 职场文书
TS 类型收窄教程示例详解
2022/09/23 Javascript