Python FTP两个文件夹间的同步实例代码


Posted in Python onMay 25, 2018

具体代码如下所示:

# -*- coding: utf-8 -*- 
''''''' 
  ftp自动检测源文件夹的更新,将源文件夹更新的内容拷贝到目标文件夹中 
  使用树的层序遍历算法,支持深度目录拷贝 
''' 
import os 
from ftplib import FTP 
import os,sys,string,datetime,time 
import shutil 
import socket 
class MyUpdateMonitor(object): 
  def __init__(self, hostaddr, username, password, remotedir_old, remotedir_new, port = 21): 
    self.hostaddr = hostaddr 
    self.username = username 
    self.password = password 
    self.remotedir_old = remotedir_old 
    self.remotedir_new = remotedir_new 
    # self.port = port 
    self.ftp = FTP() 
    # 源文件文件队列 
    self.FolderListOld = [] 
    # 目标文件文件队列 
    self.FolderListNew = [] 
  def __del__(self): 
    self.ftp.close() 
    self.FolderListOld.clear() 
    self.FolderListNew.clear() 
  def FtpLogin(self): 
    ftp = self.ftp 
    try: 
      timeout = 300 
      socket.setdefaulttimeout(timeout) 
      ftp.set_pasv(True) 
      print u'开始连接到 %s' %(hostaddr) 
      ftp.connect(hostaddr) 
      print u'成功连接到 %s' %(hostaddr) 
      print u'开始登录到 %s' %(hostaddr) 
      ftp.login(username, password) 
      print u'成功登录到 %s' %(hostaddr) 
      ftp.getwelcome() 
    except Exception, e: 
      print 'find exception now:',e 
  # 使用树的层序遍历来检查文件目录 
  def LevelOrderFolder(self): 
    # 新增文件起始位置和终止位置 
    start = 0 
    end = 0 
    try: 
      # 将根目录放入队列中 
      self.FolderListOld.append(self.remotedir_old) 
      self.FolderListNew.append(self.remotedir_new) 
      while not (0 == len(self.FolderListOld)): 
        end = start 
        # 将文件夹下的文件全部压入队列 
        if os.path.isdir(self.FolderListOld[0]): 
          files = os.listdir(self.FolderListOld[0]) 
          for file in files: 
            self.FolderListOld.append(os.path.join(self.FolderListOld[0], file)) 
          # 确定新增文件在队列中的位置 
          end += len(files) 
        # 将已经查看的文件夹删除 
        del self.FolderListOld[0] 
        # 检查目标文件夹该级目录 
        if os.path.isdir(self.FolderListNew[0]): 
          # 将该级目录的文件都列出 
          files = os.listdir(self.FolderListNew[0]) 
          # 检查源文件该级目录下的文件在目标该级目录下是否有 
          for file in self.FolderListOld[start:end]: 
            temp = file.split('\\') 
            if temp[-1] in files: 
              # 这里判断文件大小是否一致,不一致拷过去 
              if os.path.isfile(file) and not os.path.getsize(file) == os.path.getsize(os.path.join(self.FolderListNew[0], temp[-1])): 
                print 'Find the file(%s) size is changed!\n' % file 
                # print r'Start delete...\n' 
                # os.remove(os.path.join(self.FolderListNew[0], temp[-1])) 
                # print r'delete is over...\n' 
                print 'Start Copy...\n' 
                shutil.copyfile(file, os.path.join(self.FolderListNew[0], temp[-1])) 
                print 'Copy is over...\n' 
              # # 如果是文件夹存在,但是修改过,没有必要全部拷贝文件夹,可以到文件夹中拷贝单个文件 
              # if os.path.isfile(file) and not (os.path.getmtime(file) == os.path.getmtime(os.path.join(self.FolderListNew[0], temp[-1]))): 
              #   print 'Find the file(%s) size is changed!\n' % file 
              #   changetime = os.path.getmtime(file) #以毫秒为单位的时间,自1970年开始到现今 
              #   changetime = float(changetime) 
              #   print 'Change Time is', time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(changetime)), r'\n' 
              # 
              #   print 'Start Copy...\n' 
              #   shutil.copyfile(file, os.path.join(self.FolderListNew[0], temp[-1])) 
              #   print 'Copy is over...\n' 
            else: 
              if os.path.isdir(file): 
                # 如果是文件夹不存在使用,目录树拷贝 
                print 'Find the folder(%s) is updated!\n' % file 
                print 'Start Copy...\n' 
                shutil.copytree(file, os.path.join(self.FolderListNew[0], temp[-1])) 
                print 'Copy is over...\n' 
              else: 
                # 如果是文件 
                print 'Find the file(%s) is updated!\n' % file 
                print 'Start Copy...\n' 
                shutil.copyfile(file, os.path.join(self.FolderListNew[0], temp[-1])) 
                print 'Copy is over...\n' 
            self.FolderListNew.append(os.path.join(self.FolderListNew[0], temp[-1])) 
        del self.FolderListNew[0] 
        start = end - 1 
    except Exception, e: 
      print 'find exception now:',e 
if __name__ == '__main__': 
  # 配置如下变量 
  hostaddr = r'10.204.16.28' # ftp地址 
  username = r' ' # 用户名 
  password = r' ' # 密码 
  remotedir_old = r'\\10.204.16.28\Home\TDME\Test\Old\TMUMH_1.6.1055' 
  remotedir_new = r'\\10.204.16.28\Home\TDME\Test\New\TMUMH_1.6.1055' 
  monitorfileupdae = MyUpdateMonitor(hostaddr, username, password, remotedir_old, remotedir_new) 
  monitorfileupdae.FtpLogin() 
  while True: 
    print 'Start Check Update...\n' 
    monitorfileupdae.LevelOrderFolder() 
    print 'Check Update is Over...\tSleep one hour...' 
    time.sleep(3600) 
  print 'hello'

总结

以上所述是小编给大家介绍的Python FTP两个文件夹间的同步实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
wxPython 入门教程
Oct 07 Python
python中查找excel某一列的重复数据 剔除之后打印
Feb 10 Python
python函数式编程学习之yield表达式形式详解
Mar 25 Python
DataFrame 将某列数据转为数组的方法
Apr 13 Python
Python多重继承的方法解析执行顺序实例分析
May 26 Python
Python函数装饰器常见使用方法实例详解
Mar 30 Python
提升Python程序性能的7个习惯
Apr 14 Python
python3射线法判断点是否在多边形内
Jun 28 Python
Python socket实现的文件下载器功能示例
Nov 15 Python
如何通过Django使用本地css/js文件
Jan 20 Python
解决在keras中使用model.save()函数保存模型失败的问题
May 21 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
Python单元测试实例详解
May 25 #Python
python 请求服务器的实现代码(http请求和https请求)
May 25 #Python
django将图片上传数据库后在前端显式的方法
May 25 #Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 #Python
Django1.9 加载通过ImageField上传的图片方法
May 25 #Python
python matplotlib 在指定的两个点之间连线方法
May 25 #Python
基于python OpenCV实现动态人脸检测
May 25 #Python
You might like
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
2016/06/21 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
jQuery Jsonp跨域模拟搜索引擎
2017/06/17 jQuery
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
webstrom Debug 调试vue项目的方法步骤
2018/07/17 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
easy_install python包安装管理工具介绍
2013/02/10 Python
python内存管理分析
2015/04/08 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
Python调用C语言程序方法解析
2020/07/07 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
关于是否需要写商业计划书
2014/02/07 职场文书
新法人代表任命书
2014/06/06 职场文书
购房协议书范本(无房产证)
2014/10/07 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL