一个python的文件对比脚本
脚本主要用来给游戏客户端做热更的。
处理方式就是针对每个文件求其MD5值,再根据文件的目录和名字对比两个版本的MD5值,如果不一样,则这次热更就需要更新这个文件。
用法很简单。
1,生成MD5码列表
参数有-i,针对某个目录下的指定路径下的所有文件生成MD5的列表。-v 当前版本号多少
2,对比两个路径的文件,并且将不同MD5的文件输出到指定路径下。
参数有-l,-r,-o.
-l就是左边的文件,为比较旧版本的目录。
-r就是右边的文件,为最新版本的目录。
-o就是不同文件的输出目录。
对比会优先查找左边文件夹下是否有.md5,如果有的话,会优先使用文件里的md5记录。
import sys, getopt
import os
import os.path
import hashlib
import shutil searchFolders = ["\\src\\", "\\res\\"] def usage():
print "this is useage" def getmd5(filename, parentName, folderName):
m = hashlib.md5()
mfile = open(filename, 'rb')
m.update(mfile.read())
mfile.close()
md5value = m.hexdigest() #get last part of file name
subStr = filename[len(parentName) - len(folderName):len(filename)]
return md5value+"\t"+ subStr def getCurDir():
path = sys.path[0]
if os.path.isdir(path):
return path
elif os.path.isfile(path):
return os.path.dirname(path) def saveFile(str, ver):
f = open(getCurDir() + "/" + ver + ".md5", 'w')
f.write(str)
f.close() def getDescOfUrl(url):
saveStr = ""
descList = []
index = 0
for parent,dirnames,filenames in os.walk(url):
for filename in filenames:
for i, val in enumerate(searchFolders):
targParent = url + val
if targParent in parent:
fullPath = os.path.join(parent, filename)
md5 = getmd5(fullPath, targParent, val)
#print "file is: " + md5
saveStr = saveStr + md5 + "\n"
descList.append(md5) return saveStr, descList def onIArg(url, ver):
saveStr, descList = getDescOfUrl(url)
saveFile(saveStr, ver) def getDicByFile(url):
file = open(url)
line = f.readline()
retDic = {}
while line:
md5, filename = line.split("\t")
retDic[filename] = md5 return retDic def getDicByUrl(url):
saveStr, splitArr = getDescOfUrl(url)
retDic = {} for value in splitArr:
md5, filename = value.split("\t")
retDic[filename] = md5 return retDic def getDicOfUrl(url):
fileList = os.listdir(url)
version = ""
for value in fileList:
if os.path.splitext(value)[1] == '.md5':
version = os.path.splitext(value)[0]
break if version != "":
return getDicByFile(url + "/" + version + ".md5")
else:
return getDicByUrl(url) opts,args = getopt.getopt(sys.argv[1:], "hi:l:r:v:o:") inputFile = ""
leftFile = ""
rightFile = ""
outFile = ""
version = ""
showHelp = False for op, value in opts:
if op == "-i":
inputFile = value
elif op == "-v":
version = value
elif op == "-l":
leftFile = value
elif op == "-r":
rightFile = value
elif op == "-o":
outFile = value
elif op == "-h":
showHelp = True if showHelp:
usage()
sys.exit()
elif inputFile != "": if version == "":
print "you must input the version value using -v"
sys.exit() onIArg(inputFile, version)
elif leftFile != "":
if rightFile == "":
print "you must input the right file url using -r"
sys.exit()
elif outFile == "":
print "you must input the out direct using -o"
sys.exit()
else:
print "on diff .."
diffDic = {}
leftDic = getDicOfUrl(leftFile)
rightDic = getDicOfUrl(rightFile)
for (filename, md5) in rightDic.items():
if not leftDic.has_key(filename):
diffDic[filename] = True
elif leftDic.get(filename) != md5:
diffDic[filename] = True for (filename, val) in diffDic.items():
#if the folder exit
inUrl = rightFile + filename
outUrl = outFile + filename
folderIndex = outUrl.rfind("\\") outFolder = outUrl[0:folderIndex] if not os.path.isdir(outFolder):
os.makedirs(outFolder) print("copy from " + rightFile + filename)
print("to " + outUrl) shutil.copy(inUrl, outUrl)
脚本里的
searchFolders 是表示获取当前路径下这些子目录的所有文件。可以根据自己项目的情况,自己修改。
一个python的文件对比脚本的更多相关文章
- python编写文件统计脚本
python编写文件统计脚本 思路:用os模块中的一些函数(os.listdir().os.path.isdir().os.path.join().os.path.abspath()等) 实现功能:显 ...
- python如何通过windows命令行运行一个python程序文件?
python如何通过windows命令行运行一个python程序文件? cmd 进入到py文件对应目录下或者直接在上面的文件地址栏输入cmd,敲入回车 定位到对应的目录下 输入python xxx.p ...
- 一个python的邮件发送脚本,自动,定时,可以附件发送,抄送,附有说明文件
#!/bin/env python # -*- coding: utf-8 -*- import datetime import smtplib import os,sys from email.mi ...
- 小事牛刀之——python做文件对比
使用python对比filename1和filenam2的差异,并将差异写入到filename3中. #!/usr/bin/env python # -*- coding: utf-8 -*- # @ ...
- Python easyGUI 文件对比 覆盖保存
#在35-3的基础上进行优化,当用户点击ok按钮的时候,对打开的文件进行检查是否修改.# 如果修改过,则提示覆盖保存.放弃保存.另存为并实现相应的功能 1 import easygui as g im ...
- python 将文件描述符包装成文件对象
有一个对应于操作系统上一个已打开的I/O 通道(比如文件.管道.套接字等)的整型文件描述符,你想将它包装成一个更高层的Python 文件对象. 一个文件描述符和一个打开的普通文件是不一样的.文件描述符 ...
- 【Python脚本】Python创建删除文件-----------我的第一个Python脚本
Python相对C++和Java来说,是解释性语言,非常适合来编写脚本. 很久之前就开始学习Python的语法了,今天写了第一个Python的脚本,来简化我的一些日常工作. 我平时学习的时候喜欢新建一 ...
- 编写一个python脚本功能-备份
版本一 解决方案当我们基本完成程序的设计,我们就可以编写代码了,它是对我们的解决方案的实施.版本一例10.1 备份脚本——版本一 #!/usr/bin/python # Filename: backu ...
- (python功能定制)复杂的xml文件对比,产生HTML展示区别
功能的设计初衷: 处理复杂的xml对比,屏蔽同节点先后顺序的影响 主要涉及知识点: 1.xml解析 ------- ElementTree库 2.文件比对差别 ------- difflib库 3.获 ...
随机推荐
- 2018.9.8pat秋季甲级考试
第一次参加pat考试,结果很惨,只做了中间两道题,还有一个测试点错误,所以最终只得了不到50分.题目是甲级练习题的1148-1151. 考试时有些紧张,第一题第二题开始测试样例都运行不正确,但是调试程 ...
- java研发常见问题总结2
1. String.StringBuffer与StringBuilder之间区别 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 ...
- 如何使用Win32API绘制树
一.这个已经有几年时间了,刚开始学习charlie的<windows程序设计>的时候做的.现在看来,代码很乱,虽然后来还整理过几次,现在这方面没什么兴趣了,有兴趣的可自由下载. 二.绘制二 ...
- 新建一个controller并指定为默认的方法
在之前的项目中升级了MVC的DLL导致一开始程序运行时走的controller的有参构造方法变为走无参构造方法,但是该controller没有无参的构造方法,为了强制让程序走有参的构造方法,就在glo ...
- OpenCV自带dnn的Example研究(5)— segmentation
这个博客系列,简单来说,今天我们就是要研究 https://docs.opencv.org/master/examples.html下的 6个文件,看看在最新的OpenCV中,它们是如何发挥作用的. ...
- Linux添加新硬盘,设置分区和开机自动挂载之图文教程!
虚拟机添加硬盘的步骤就不多废话了,主要列出添加硬盘后要进行设置的几个详细步骤: 1.查看磁盘信息:fdisk -ls 添加前如下图所示: 添加后如下图: 也可以用:ls /dev/sd*查看,如下图: ...
- iOS网络图片缓存详解
在开发移动应用的时候比如Android,IOS,因为手机流量.网速.内存等这些因素,当我们的移动应用是针对互联网,并要频繁访问网络的话,对网络优化这块就显得尤为重要了. 比如某个应用要经常显示网络图片 ...
- 在xampp修改密码
1.选择 服务器--账号--修改密码 2.在密码 一栏输入新密码 3.刷新页面会得到如下页面 此时,该页面提醒我们检查配置文件中的主机.用户名和密码 4.打开配置文件 路径为 xampp -> ...
- margin与padding大比拼
用margin还是用padding这个问题相信是每个学css的人都想要去深入了解的. CSS边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距 ...
- Python的静态方法和类方法
Python中使用@staticmethod这个装饰器让方法变为静态方法 一:定义 @staticmethod: 首先它是一个装饰器,被装饰的方法不需要隐含的参数,对象和对象的实例都可以调用静态方法 ...