python实现两个文件夹的同步


Posted in Python onAugust 29, 2019

其实无论windows还是Linux,简单地去实现两个两个文件夹的同步只需系统自带的复制命令加参数就可以了。

WINDOWS:

xcopy 源文件夹\* 目标文件夹 /s /e /y

Linux:

cp -r 源文件夹/* 目标文件夹

这里使用python来实现这些基本功能,并增加一些去重之类的增强功能。

1、复制源文件夹中文件至目标文件夹

要想同步两个文件夹中的数据,基本思路首先需要遍历源文件夹中的信息,将源文件夹中的文件复制到目标文件夹。

遍历文件夹采用os中的listdir函数就可以了。

import os
 
path_s = 'F:\\test\\s'
path_t = 'F:\\test\\t'
 
for filename in os.listdir(path_s):
 filename_s = path_s+os.sep+filename
 print '[*] Source :',filename_s
 filename_t = path_t+os.sep+filename
 print '[*] Target :',filename_t
 with open(filename_s,'rb') as f_s:
 with open(filename_t,'wb') as f_t:
  f_t.write(f_s.read())

但是很明显这里没有考虑源文件夹中还会存在文件夹甚至多重文件夹的情况。

2、源文件夹中存在多重文件夹

一个简单的思路就是:在遍历源文件夹内的文件时,先判定当前文件这是文件还是文件夹。如果当前文件是文件夹的话,开始遍历此文件夹内的文件,如果里面还有文件夹,遍历这个文件夹,依次类推。利用递归的方法,代码如下:

import os
 
 
path_s = 'F:\\test\\s'
path_t = 'F:\\test\\t'
 
def copy_file(paths,patht):
 for filename in os.listdir(paths):
 filename_s = paths+os.sep+filename
 filename_t = patht+os.sep+filename
 if os.path.isdir(filename_s):
  if not os.path.exists(filename_t):
  os.mkdir(filename_t) #在目标文件夹中创建对应的文件夹
  copy_file(filename_s,filename_t) # 递归
 else:
  print '[*] Source :',filename_s
 
  print '[*] Target :',filename_t
  with open(filename_s,'rb') as f_s:
  with open(filename_t,'wb') as f_t:
   f_t.write(f_s.read())
 
 
copy_file(path_s,path_t)

目前,简单的文件夹复制功能已经实现了。

3、目标文件夹中已有文件不再复制

一个简单的方法就是在目标文件夹中复制文件之前先利用函数“os.path.exists”判定这个文件是否存在。

import os
 
 
path_s = 'F:\\test\\s'
path_t = 'F:\\test\\t'
 
def copy_file(paths,patht):
 for filename in os.listdir(paths):
 filename_s = paths+os.sep+filename
 filename_t = patht+os.sep+filename
 if os.path.isdir(filename_s):
  if not os.path.exists(filename_t):
  os.mkdir(filename_t)
  copy_file(filename_s,filename_t)
 else:
  if os.path.exists(filename_t):
  print '[*] "%s" already exists! ' % filename_t
  else:
  print '[*] Source :',filename_s
 
  print '[*] Target :',filename_t
  with open(filename_s,'rb') as f_s:
   with open(filename_t,'wb') as f_t:
   f_t.write(f_s.read())
 
copy_file(path_s,path_t)

这个办法避免了一部分已有文件的重复复制操作,减少了部分不必要的读写操作,但是却无法消除内容相同但名称、路径不同的重复文件。

4、利用MD5判定重复文件

目前判定两个文件是否相同,除了按字节逐个对比这个笨方法外,简单常用的办法就是利用MD5和CRC校验,或是按一定规律挑取文件的指定位置的数据块就行对比。

这次利用文件的MD5值,将目标文件夹中已有文件的MD5值保存到列表或字典中,每在源文件夹中读取一个文件就判定该文件的MD5值是否已经存在于MD5列表,没有的话再进行复制操作,并将该文件的MD5值写入列表。

import os
import hashlib
 
path_s = 'F:\\test\\s'
path_t = 'F:\\test\\t'
list_file = {}
 
def create_file_list(path):
 for name in os.listdir(path):
 filename = path+os.sep+name
 if os.path.isdir(filename):
  create_file_list(filename)
 else:
  with open(filename,'rb') as f:
  md5 = hashlib.md5(f.read()).hexdigest()
  if md5 not in list_file:
   list_file[md5] = 1
 
def copy_file(paths,patht):
 for filename in os.listdir(paths):
 filename_s = paths+os.sep+filename
 filename_t = patht+os.sep+filename
 if os.path.isdir(filename_s):
  if not os.path.exists(filename_t):
  os.mkdir(filename_t)
  copy_file(filename_s,filename_t)
 else:
  if os.path.exists(filename_t):
  print '[*] "%s" already exists! ' % filename_t
  else:
  with open(filename_s,'rb') as f_s:
   data = f_s.read()
   file_md5 = hashlib.md5(data).hexdigest()
   if file_md5 not in list_file:
   list_file[file_md5] = 1
   print '[*] Source :',filename_s
   print '[*] Target :',filename_t
   with open(filename_t,'wb') as f_t:
    f_t.write(data)
   else:
   print '[*] "%s"\'s MD5 already exists! ' % filename_t
 
create_file_list(path_t)
copy_file(path_s,path_t)

如下图,运行后内容相同的几个文件,只有第一次读取到的时候才写入目标文件夹,其他路径下的文件并没有复制到目标文件夹。

python实现两个文件夹的同步

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python根据开头和结尾字符串获取中间字符串的方法
Mar 26 Python
python基于右递归解决八皇后问题的方法
May 25 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
Django rest framework基本介绍与代码示例
Jan 26 Python
Python合并多个Excel数据的方法
Jul 16 Python
python训练数据时打乱训练数据与标签的两种方法小结
Nov 08 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
详解Python sys.argv使用方法
May 10 Python
对numpy下的轴交换transpose和swapaxes的示例解读
Jun 26 Python
Python图像处理模块ndimage用法实例分析
Sep 05 Python
Python 输出详细的异常信息(traceback)方式
Apr 08 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
Jul 01 Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 #Python
python+rsync精确同步指定格式文件
Aug 29 #Python
django-rest-swagger对API接口注释的方法
Aug 29 #Python
Python3视频转字符动画的实例代码
Aug 29 #Python
scikit-learn线性回归,多元回归,多项式回归的实现
Aug 29 #Python
python中property属性的介绍及其应用详解
Aug 29 #Python
django-rest-swagger的优化使用方法
Aug 29 #Python
You might like
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
PHP类中Static方法效率测试代码
2010/10/17 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
简单的php购物车代码
2020/06/05 PHP
来自国外的页面JavaScript文件优化
2010/12/08 Javascript
JavaScript初学者应注意的七个细节详细介绍
2012/12/27 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
jQuery实现模拟flash头像裁切上传功能示例
2016/12/11 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
python实现马耳可夫链算法实例分析
2015/05/20 Python
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
python实现弹跳小球
2019/05/13 Python
keras分类模型中的输入数据与标签的维度实例
2020/07/03 Python
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
实习销售业务员自我鉴定
2013/09/21 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
反对邪教标语
2014/06/30 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
门面房租房协议书
2014/12/01 职场文书
有关西游记的读书笔记
2015/06/25 职场文书
学生早退检讨书(范文)
2019/08/19 职场文书