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 相关文章推荐
shelve  用来持久化任意的Python对象实例代码
Oct 12 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
Python 存储字符串时节省空间的方法
Apr 23 Python
Python检测数据类型的方法总结
May 20 Python
Python任意字符串转16, 32, 64进制的方法
Jun 12 Python
python pytest进阶之fixture详解
Jun 27 Python
Django stark组件使用及原理详解
Aug 22 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
Sep 06 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 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返回字符串中所有单词的方法
2015/03/09 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
AngularJs Scope详解及示例代码
2016/09/01 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
Java分治归并排序算法实例详解
2017/12/12 Python
python2 与python3的print区别小结
2018/01/16 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
python递归法解决棋盘分割问题
2019/07/17 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
利用python在excel中画图的实现方法
2020/03/17 Python
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
优秀应届毕业生自荐信
2013/11/16 职场文书
药品促销活动方案
2014/02/14 职场文书
文员岗位职责范本
2014/03/08 职场文书
白岩松演讲
2014/05/21 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
2019年最新证婚词精选集!
2019/06/28 职场文书