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 29 Python
python中使用序列的方法
Aug 03 Python
利用Python如何批量更新服务器文件
Jul 29 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
python实现顺时针打印矩阵
Mar 02 Python
python制作抖音代码舞
Apr 07 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
Sep 20 Python
Python类中self参数用法详解
Feb 13 Python
jupyter notebook 参数传递给shell命令行实例
Apr 10 Python
如何解决cmd运行python提示不是内部命令
Jul 01 Python
Python 类,对象,数据分类,函数参数传递详解
Sep 25 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
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
给js文件传参数(详解)
2014/07/13 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
js实现数字滚动特效
2019/12/16 Javascript
小程序中的箭头函数的具体使用
2020/06/19 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
Python MD5文件生成码
2009/01/12 Python
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
Python机器学习之决策树算法
2017/12/22 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
django model通过字典更新数据实例
2020/04/01 Python
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
给物业的表扬信
2014/01/21 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
大学毕业谢师宴致辞
2015/07/27 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
前端JavaScript大管家 package.json
2021/11/02 Javascript
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers