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下rrdtool模块的基本使用方法
Nov 13 Python
python爬取w3shcool的JQuery课程并且保存到本地
Apr 06 Python
使用pandas对两个dataframe进行join的实例
Jun 08 Python
Python3非对称加密算法RSA实例详解
Dec 06 Python
python实现公司年会抽奖程序
Jan 22 Python
在python中对变量判断是否为None的三种方法总结
Jan 23 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
python3.x实现base64加密和解密
Mar 28 Python
python实现爬山算法的思路详解
Apr 09 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
快速解释如何使用pandas的inplace参数的使用
Jul 23 Python
python通用数据库操作工具 pydbclib的使用简介
Dec 21 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
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
js调试系列 初识控制台
2014/06/18 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
pycharm 使用心得(一)安装和首次使用
2014/06/05 Python
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
Python制作简单的网页爬虫
2015/11/22 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
学习标兵获奖感言
2014/02/20 职场文书
文化建设工作方案
2014/05/12 职场文书
房屋出租委托书格式
2014/09/23 职场文书
中学生检讨书1000字
2014/10/28 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫