前言

这个程序陆陆续续开发了几天,正好我在学Python,就一边做一边学,倒是学到不少东西。

不得不说python是快速开发的好工具。

程序做了一些改进,这两天又忙着毕设,现在才想起来发到博客上。想想回头github也要启用起来,不能继续荒废了……

如果嫌运行python程序不方便的话,可以直接使用exe可执行文件版本。

废话不多说,我介绍一下这个工具。

应用场景

在日常使用中,我们往往需要把一个文件夹拷到另一个文件夹下面,做一些修改之后,再将改动的文件夹合并回去。

例如,从优盘中把一个要用的文件夹拷到电脑上,在pc机上工作,之后你需要将修改后的文件夹再拷回优盘中带走。

这个时候问题来了。

如果你做的修改不多,我们可以简单的把修改的文件复制回去,这个时候你清楚的记得你到底修改了哪些文件。

但是如果你对很多文件做了改动,并且还创建了几个文件或者文件夹,导致目录结构变得十分复杂,最后你自己都记不起来到底哪些文件做了哪些改动,目录做了哪些更新,这个时候你要把文件夹合并回去就有些凌乱了……

So,你需要一个工具去帮你记忆你做的改动,自动的帮你合并文件夹,并且不会丢失任何文件。

这个时候这个小工具就可以派上用场了~

下面演示一下怎么用。

使用演示

现在有两个工作空间

工作空间1是你之前做好的一个工程或者文件夹,里面放满了文件,目录结构复杂。

详细目录:

工作空间2是你现在要工作的目录,现在是空的。

我们把要用的文件夹拷过来

并在里面做一些改动。

这里不放图了,总之我创建了一个文件夹,创建了两个文件,修改了三个文件……现在目录结构变成这样:

大家看到,1/下多了一个文件夹33,里面多了两个文件111.txt和222.txt,我还修改了一个txt文件,一个ppt文件和一个word文件。

下面运行PathMerge:

输入A目录(修改的文件夹)和B目录(原文件夹),要将A==>B,A合并到B。

回车开始合并:

合并成功!

合并的记录都列在上面了,如果名称相同的文件会将旧文件创建一个副本,修改后的文件直接复制过去,程序中没有删除文件的代码,可放心食用。

上图可知复制了三个文件,创建了三个旧文件副本,另外复制了创建的目录。

将工作空间2中1文件做的所有改动都包含了进去。

以上,就是PathMerge的使用演示。

代码

1 #coding=gbk

2

3 #PathMerge.py

4 #作者:freecode

5 #创建时间:2016.4.9 20:15

6 #作用:

7 #合并并两个目录/文件夹。

8 #将目录A合并到目录B,同级目录下,

9 #将A中有,B中没有的目录完全复制到B中;

10 #将A中没有,B中有的目录不做改动;

11 #将A中做了修改的文件,在B的同级目录下创建一个副本。(注意不是覆盖)

12 #13 #适应场景:

14 #一般A是从B复制过来的文件夹,做了修改后,想合并回B。

15 #这样在A中做的一些改动我们就不知道了,这个程序的作用是,

16 #将A中修改的部分在B中更新。

17 #18 #版本:

19 #将修改后的文件完全复制过去

20 #旧的文件创建副本

21 #基于文件的MD5值判断是否修改过

22 #23

24 importos25 importshutil26 importtime27 importhashlib28 importsys29

30 def Help(): #输出帮助文档

31 print """

32 PathMerge.py33 作者:freecode34 创建时间:2016.4.9 20:1535 作用:36 合并并两个目录/文件夹。37 将目录A合并到目录B,同级目录下,38 将A中有,B中没有的目录完全复制到B中;39 将A中没有,B中有的目录不做改动;40 将A中做了修改的文件,在B的同级目录下创建一个副本。(注意不是覆盖)41

42 适应场景:43 一般A是从B复制过来的文件夹,做了修改后,想合并回B。44 这样在A中做的一些改动我们就不知道了,这个程序的作用是,45 将A中修改的部分在B中更新。46

47 版本:48 将修改后的文件完全复制过去49 旧的文件创建副本50 基于文件的MD5值判断是否修改过51 """

52

53 def GetFileMd5(filename): #计算文件的md5值

54 if notos.path.isfile(filename):55 return

56 myhash =hashlib.md5()57 f = file(filename,'rb')58 whileTrue:59 b = f.read(8096)60 if notb :61 break

62 myhash.update(b)63 f.close()64 returnmyhash.hexdigest()65

66 def isModify(A_file,B_file): #判断两个文件是否相同,如果不同,表示修改过

67 #参数需是绝对路径

68 return GetFileMd5(A_file) !=GetFileMd5(B_file)69

70 def Stamp2Time(Stamp): #将时间戳转换成时间显示格式

71 timeArray =time.localtime(Stamp)72 Time = time.strftime("%Y年%m月%d日 %H时%M分%S秒 旧文件副本", timeArray)73 returnTime74

75 def Merge(A_path,B_path): #合并两个目录

76 B_paths = os.listdir(B_path) #获取当前B中的目录结构

77 for fp in os.listdir(A_path): #遍历当前A目录中的文件或文件夹

78 A_new_path = os.path.join(A_path,fp) #A中的文件或目录

79 B_new_path = os.path.join(B_path,fp) #B中对应的文件或路径,不一定存在

80

81 if os.path.isdir(A_new_path): #A中的目录

82 if os.path.exists(B_new_path): #如果在B中存在

83 Merge(A_new_path,B_new_path) #继续合并下一级目录

84 else: #如果在B中不存在

85 print '[目录]\t%s ===> %s' %(A_new_path,B_new_path)86 shutil.copytree(A_new_path,B_new_path) #完全复制目录到B

87

88 elif os.path.isfile(A_new_path): #A中的文件

89 if os.path.exists(B_new_path): #如果在B中存在

90 s =os.stat(B_new_path)91 if isModify(A_new_path,B_new_path) == True: #如果该文件修改过

92 #创建副本

93 suffix = B_new_path.split('.')[-1] #得到文件的后缀名

94 #将B中原文件创建副本

95 B_copy_path = B_new_path[:-len(suffix)-1]+"(%s)."%(Stamp2Time(s.st_mtime))+suffix96 print '[副本]\t%s ===> %s' %(A_new_path,B_copy_path)97 shutil.copy2(B_new_path,B_copy_path)98 #将A中修改后文件复制过来

99 print '[文件]\t%s ===> %s' %(A_new_path,B_new_path)100 shutil.copy2(A_new_path,B_new_path)101 else: #如果该文件没有修改过

102 pass #不复制

103

104 else: #如果在B中不存在

105 #将该文件复制过去

106 print '[文件]\t%s ===> %s' %(A_new_path,B_new_path)107 shutil.copy2(A_new_path,B_new_path)108

109 #运行模式

110 if __name__=='__main__':111 print """

112 欢迎使用PathMerge!113 本程序将会把目录A合并到目录B,即 A ===> B114 将A目录中修改的内容在B目录中更新115 合并规则具体见 PathMerge.Help()116 """

117 if len(sys.argv) == 1:118 path1 = raw_input('请输入A目录:').strip()119 path2 = raw_input('请输入B目录:').strip()120 elif len(sys.argv) == 2:121 path1 = sys.argv[1].strip()122 print 'A目录为:%s\n' %(path1)123 path2 = raw_input('请输入B目录:').strip()124 elif len(sys.argv) == 3:125 path1 = sys.argv[1].strip()126 print 'A目录为:%s\n' %(path1)127 path2 = sys.argv[2].strip()128 print 'B目录为:%s\n' %(path2)129 else:130 print 'ERROR:参数错误!\n参数最多有三个!\n'

131 raw_input('\n请按回车键(Enter)退出……')132 sys.exit(0)133 #去除目录的引号

134 if path1[0]=='\"':135 path1 = path1[1:-1]136 if path2[0]=='\"':137 path2 = path2[1:-1]138

139 print """

140 开始合并目录 %s141 到目录 %s142 %s ===> %s143 """ %(path1,path2,path1,path2)144

145 try:146 print '合并中……'

147 Merge(path1,path2)148 print ''

149 exceptException,e:150 print '合并失败!'

151 print '失败原因:\n',e152 else:153 print '合并成功!'

154

155 raw_input('\n请按回车键(Enter)退出……')156

工具特性

1、可识别加“”的目录和不加“”的目录。

2、使用MD5识别文件是否修改。

MD5识别文件的内容见上一篇博文:python计算文件的md5值

3、可传递参数,用来写脚本。例:

4、原文件夹内的旧文件不会被删除,而是创建一个带有时间戳的副本。修改过的文件直接复制过去。

这样不用担心合并之后文件莫名其妙的丢失啦。使用该工具不会有文件删除操作。

注意

Sorry,目前仅支持windows环境……

参考资料

原创声明

python怎么把两个文件合并工具_python开发目录合并小工具 PathMerge相关推荐

  1. java时序图工具_开发必备的小工具,你用过几个?

    今天就简单介绍一下平时用到的一些小工具.首先我平时是用IDEA开发的,所以下面的介绍都是和IDEA相关的.本文主要介绍我平时在哪些场景使用,使用了哪些功能,至于IDEA怎么安装插件和插件有哪些额外的功 ...

  2. python开发网络小工具_Python集成网络诊断小工具(含有ping,tracert,tcping等小工具)...

    之前在一家IDC公司实习,负责服务器售后方面的,经常要使用ping,tracert,tcping等命令做些初步的诊断,判断服务器问题出在哪方面.于是就想集成这些常用的命令或工具到一个GUI界面中,实现 ...

  3. python可以做哪些小工具_python的简单实用小工具

    在python进行自动化编写的过程中,常常需要造一些数据,比如,获取随机的合法IP,随机的字符串,当前的时间等,下面的一些方法应该可以用到,希望对你有所帮助 #!/user/bin/env pytho ...

  4. python如何写各种小工具_python写了个小工具

    源码太多,看的头疼.在目录里找含有某个字符串的文件.结果写到result.txt中 import os import codecs fileinfo=open('result.txt','w')  # ...

  5. 基于python的selenium两种文件上传方式

    方法一.input标签上传     如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径. 方法二.非input标签上传 这种上传方式需要借助第三方工具,主要有以下三种情 ...

  6. 一个python+flask和SQLite的数字查找以及Dataload命令生成的小工具

    在日常工作中,我经常需要从excel中通过vlookup函数查询一些工单号,然后生成Dataload命令来进行工单结束的批量操作. 这些操作通常需要打开ecxcel,然后挨个输入户号.如果每次都要打开 ...

  7. Python根据URL地址下载文件并保存至对应目录

    Python根据URL地址下载文件并保存至对应目录 引言 在编程中经常会遇到图片等数据集将图片等数据以URL形式存储在txt文档中,为便于后续的分析,需要将其下载下来,并按照文件夹分类存储.本文以Gi ...

  8. 利用Python3开发一款小工具(界面的设计)

    前面在<利用Python3开发一款小工具(引言)>文章中,对我们的需求进行了分析.为了能够让用户运行该工具,因此我们需要一个ui界面,而python中常用的工具就是pyqt,本文将使用py ...

  9. WPF开发的实用小工具 - 快捷悬浮菜单

    WPF开发的实用小工具 - 快捷悬浮菜单 ❝ 本文由网友投稿,Dotnet9站长整理.站长觉得这小工具很实用,站长家里.公司也在尝试使用了. 行文目录: 这工具有什么用? 正文 源码获取及应用下载体验 ...

最新文章

  1. python学习笔记 day44 数据库三范式
  2. 写一个ArrayList类的动态代理类
  3. 线下课程推荐 | 知识图谱理论与实战:构建行业知识图谱 (第四期)
  4. L1-038. 新世界
  5. 名字英文name域名_企业建站必读:六大方法锁定最佳企业域名
  6. 95-136-070-源码-Operator-扩展有状态的operators
  7. Tapestry 教程(七)在Tapestry中一起使用Hibernate
  8. DataTable的Select方法
  9. Benefits of 3D CAD Modeling for Today’s Mechanical Engineer
  10. Echarts+Vue地图
  11. 【temu】美国版数据采集API
  12. 解码h264和h265需要的cpu性能
  13. pt与px的对应关系
  14. 【深度学习|数据集】Python 划分训练集和验证集
  15. CSS+DIV布局中absolute和relative区别
  16. 一梦江湖带你走进真正的武侠世界!
  17. BERT和ERNIE中[PAD],[CLS],[SEP],[MASK],[UNK]所代表的含义
  18. 机器学习笔记之概率图模型(一)背景介绍
  19. 全面总结 Vue 3.0 的新特性
  20. git获取代码,拉取最新代码,更新代码等

热门文章

  1. MySQL的show profile(已过时)简介以及该功能在MySQL 5.7中performance_schema中的替代
  2. 关于latex的网站推荐
  3. Hibernate查询_HQL_EJBQL_QBC_QBE
  4. mysql中timestamp的自动生成与更新
  5. java验证码-汉字验证码
  6. 字符串匹配——C++使用Regex
  7. 解析网页(KMP算法实现部分)
  8. Bailian2675 计算书费【求和】
  9. POJ NOI MATH-7655 回文数个数
  10. HDU1869 六度分离【Dijkstra算法】