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爬虫常用的模块分析
Aug 29 Python
Python Queue模块详解
Nov 30 Python
Python 比较两个数组的元素的异同方法
Aug 17 Python
Python Nose框架编写测试用例方法
Oct 26 Python
python:print格式化输出到文件的实例
May 14 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
PyQt弹出式对话框的常用方法及标准按钮类型
Feb 27 Python
Django中自定义查询对象的具体使用
Oct 13 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
python字符串常用方法及文件简单读写的操作方法
Mar 04 Python
Pyqt助手安装PyQt5帮助文档过程图解
Nov 20 Python
python中doctest库实例用法
Dec 31 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
一个用php3编写的简单计数器
2006/10/09 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
详解react、redux、react-redux之间的关系
2018/04/11 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
2018/09/12 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
python socket 超时设置 errno 10054
2014/07/01 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
实体的生命周期
2013/08/31 面试题
教师自我评价范文
2013/12/16 职场文书
跳蚤市场口号
2014/06/13 职场文书
环境卫生倡议书
2014/08/29 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
在校证明模板
2015/06/17 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
一文搞懂Redis中String数据类型
2022/04/03 Redis
python中的random模块和相关函数详解
2022/04/22 Python