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天气预报采集器实现代码(网页爬虫)
Oct 07 Python
Python内置的字符串处理函数详细整理(覆盖日常所用)
Aug 19 Python
谈谈如何手动释放Python的内存
Dec 17 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
python 实现提取某个索引中某个时间段的数据方法
Feb 01 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
详解Python循环作用域与闭包
Mar 21 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
Mar 11 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
May 22 Python
Python extract及contains方法代码实例
Sep 11 Python
python元组打包和解包过程详解
Aug 02 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实现把数字ID转字母ID
2013/08/12 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
Vue Element 分组+多选+可搜索Select选择器实现示例
2018/07/23 Javascript
小程序登录之支付宝授权的实现示例
2019/12/13 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
护士专业推荐信
2013/11/02 职场文书
项目经理岗位职责
2013/11/11 职场文书
幼儿园消防安全制度
2014/01/26 职场文书
转预备党员政审材料
2014/02/06 职场文书
关于读书的演讲稿
2014/05/07 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
民主评议党员个人总结
2015/02/13 职场文书
汽车销售合同文本
2019/08/08 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
python实现双向链表原理
2022/05/25 Python