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 相关文章推荐
详解Python3.1版本带来的核心变化
Apr 07 Python
讲解Python中运算符使用时的优先级
May 14 Python
Python判断字符串与大小写转换
Jun 08 Python
python读取二进制mnist实例详解
May 31 Python
python flask实现分页效果
Jun 27 Python
浅谈Python由__dict__和dir()引发的一些思考
Oct 30 Python
python numpy格式化打印的实例
May 14 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
python打开windows应用程序的实例
Jun 28 Python
python实现连连看辅助(图像识别)
Mar 25 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
如何基于windows实现python定时爬虫
May 01 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计算整个目录大小的方法
2015/06/01 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
DOM下的节点属性和操作小结
2009/05/14 Javascript
javascript 常用方法总结
2009/06/03 Javascript
jquery ajax abort()的使用方法
2010/10/28 Javascript
js字符串转换成xml对象并使用技巧解读
2013/04/18 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
Python计算程序运行时间的方法
2014/12/13 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
Python如何将函数值赋给变量
2020/04/28 Python
django form和field具体方法和属性说明
2020/07/09 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
python跨文件使用全局变量的实现
2020/11/17 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
十一个高级MySql面试题
2014/10/06 面试题
汽车销售求职自荐信
2013/10/01 职场文书
求职简历推荐信范文
2013/12/02 职场文书
社区活动邀请函范文
2014/01/29 职场文书
科学发展观演讲稿
2014/09/11 职场文书
贷款收入证明格式
2015/06/24 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL