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简单实现基于SSL的IRC bot实例
Jun 15 Python
python实现颜色空间转换程序(Tkinter)
Dec 31 Python
Django实现组合搜索的方法示例
Jan 23 Python
python实现数据库跨服务器迁移
Apr 12 Python
python 字典 按key值大小 倒序取值的实例
Jul 06 Python
Python延时操作实现方法示例
Aug 14 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
关于Python3 类方法、静态方法新解
Aug 30 Python
python 多维高斯分布数据生成方式
Dec 09 Python
python plt.plot bar 如何设置绘图尺寸大小
Jun 01 Python
python数字图像处理之对比度与亮度调整示例
Jun 28 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
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
php类常量用法实例分析
2015/07/09 PHP
JavaScript 图片预览效果 推荐
2009/12/22 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
利用aardio给python编写图形界面
2017/08/21 Python
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
python操作excel的方法
2018/08/16 Python
Pycharm更换python解释器的方法
2018/10/29 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
python中time库的实例使用方法
2019/10/31 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
tensorboard显示空白的解决
2020/02/15 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
国防教育标语
2014/10/08 职场文书
opencv检测动态物体的实现
2021/07/21 Python
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS