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 26进制计算实现方法
May 28 Python
Python调用C++程序的方法详解
Jan 24 Python
Python简单实现socket信息发送与监听功能示例
Jan 03 Python
TensorFlow平台下Python实现神经网络
Mar 10 Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
python批量处理文件或文件夹
Jul 28 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
基于python计算并显示日间、星期客流高峰
May 07 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
Jul 13 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
PHP 采集程序原理分析篇
2010/03/05 PHP
php 提速工具eAccelerator 配置参数详解
2010/05/16 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
srcElement表格样式
2006/09/03 Javascript
addRule在firefox下的兼容写法
2006/11/30 Javascript
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
json 实例详细说明教程
2009/10/31 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
Jquery 全选反选实例代码
2015/11/19 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
Vue resource中的GET与POST请求的实例代码
2017/07/21 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
layer.js之回调销毁对话框的例子
2019/09/11 Javascript
利用Python实现Windows定时关机功能
2017/03/21 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
html5 touch事件实现触屏页面上下滑动(二)
2016/03/10 HTML / CSS
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
电气个人求职信范文
2014/02/04 职场文书
企业军训感想
2014/02/07 职场文书
活动总结模板大全
2015/05/11 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
Vue如何清空对象
2022/03/03 Vue.js