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 代码效率的方法
Jul 03 Python
Python中文件操作简明介绍
Apr 13 Python
Python中集合的内建函数和内建方法学习教程
Aug 19 Python
Python实现进程同步和通信的方法
Jan 02 Python
django 修改server端口号的方法
May 14 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
Python异常处理例题整理
Jul 07 Python
python中的TCP(传输控制协议)用法实例分析
Nov 15 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
selenium中get_cookies()和add_cookie()的用法详解
Jan 06 Python
keras读取h5文件load_weights、load代码操作
Jun 12 Python
python对 MySQL 数据库进行增删改查的脚本
Oct 22 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
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
Python中的filter()函数的用法
2015/04/27 Python
在Python中使用HTML模版的教程
2015/04/29 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
彻底解决Python包下载慢问题
2020/11/15 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
Html5实现文件异步上传功能
2017/05/19 HTML / CSS
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
分布式数据库需要考虑哪些问题
2013/12/08 面试题
活动总结怎么写啊
2014/05/07 职场文书
群众路线组织生活会发言材料
2014/10/17 职场文书
北京故宫导游词
2015/01/31 职场文书
小学德育工作总结2015
2015/05/12 职场文书
因家庭原因离职的辞职信范文
2015/05/12 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫