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函数嵌套实例
Sep 23 Python
python回溯法实现数组全排列输出实例分析
Mar 17 Python
用Python脚本来删除指定容量以上的文件的教程
May 04 Python
详解django三种文件下载方式
Apr 06 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 Python
python操作redis方法总结
Jun 06 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
Python3 max()函数基础用法
Feb 19 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
python二元表达式用法
Dec 04 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 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高级对象构建 多个构造函数的使用
2012/02/05 PHP
php对图像的各种处理函数代码小结
2013/07/08 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
jQuery 行级解析读取XML文件(附源码)
2009/10/12 Javascript
海量经典的jQuery插件集合
2010/01/12 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
js鼠标滑过图片震动特效的方法
2015/02/17 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
jQuery实现字符串全部替换的方法
2016/12/12 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
[03:48]大碗DOTA
2019/07/25 DOTA
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
IE9下html5初试小刀
2010/09/21 HTML / CSS
咖啡店自主创业商业计划书
2014/01/22 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
年终考核实施方案
2014/05/26 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle
教你一步步实现一个简易promise
2021/11/02 Javascript