[0823]
1、打印当前目录、文件
def getBasePath():
#打印当前目录
print os.getcwd()
#根据abspath打印当前目录,可修改参数为../ ./ .如同目录遍历
print os.path.abspath('./')
#打印当前文件绝对路径
print sys.argv[0]
#打印当前文件名
print os.path.basename(sys.argv[0])
print os.path.basename(__file__)
print os.curdir
遍历获取指定目录下所有文件:
os.walk()
语法
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])参数:
top — 根目录下的每一个文件夹(包含它自己), 产生3-元组 (dirpath, dirnames, filenames)【文件夹路径, 文件夹名字, 文件名】。topdown –可选,为True或者没有指定, 一个目录的的3-元组将比它的任何子文件夹的3-元组先产生 (目录自上而下)。 如果topdown为 False, 一个目录的3-元组将比它的任何子文件夹的3-元组后产生 (目录自下而上)。
onerror — 可选,是一个函数; 它调用时有一个参数, 一个OSError实例。报告这错误后,继续walk,或者抛出exception终止walk。
followlinks — 设置为 true,则通过软链接访问目录。
for root,dirs,files in os.walk("F://test") :
print root,dirs,files
如果目录包含中文,则os.walk(path.encode(“gbk”))
延伸:
获取目录下所有文件名(去重):
def getloop(mpath):
allfile=[]
for root,dirs,files in os.walk(mpath) :
#print root,dirs,files
if len(files)==0:
pass
else:
#print files
for file in files:
allfile.append(file)
return allfile
def main():
mpath="F://test"
print getloop(mpath)
print set(getloop(mpath))
获取文件MD5值,进行重复文件检查
(1)普通小体积文件
#coding:utf-8
import os
import sys
import hashlib
reload(sys)
sys.setdefaultencoding("utf-8")
def getFileMd5(mfile):
with open(mfile,"rb") as f:
data=f.read()
file_md5=hashlib.md5(data).hexdigest()
return file_md5
def getloop(mpath):
allfile=[]
for root,dirs,files in os.walk(mpath) :
if len(files)==0:
pass
else:
for file in files:
allfile.append(root+"//"+file)
return allfile
def main():
mpath="F:\\test"
print getloop(mpath)
for i in (getloop(mpath)):
print i,getFileMd5(i)
if __name__ == '__main__':
main()
(2)大文件:
小文件使用f.read(),当文件体积多大该过程无比漫长,此路不通;
解决方案:
将文件拆分为8192字节的块(或128字节的其他倍数),然后使用 update()。
这利用了MD5具有128字节摘要块(8192为128×64)这一事实。由于您没有将整个文件读入内存,因此不会占用超过8192字节的内存。
—-参考:https://www.it1352.com/1612548.html
#coding:utf8
import jieba
import os
import hashlib
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
def getloop(mpath):
allfile=[]
for root,dirs,files in os.walk(mpath) :
if len(files)==0:
pass
else:
for file in files:
allfile.append(root+"//"+file)
return allfile
def getBigFileMd5(path):
fp = open(path)
checksum = hashlib.md5()
while True:
buffer = fp.read(8192)
if not buffer:
break
checksum.update(buffer)
fp.close()
checksum = checksum.hexdigest()
return checksum
def main():
mpath="F:\\OS\\KALI2016"
print getloop(mpath)
for i in (getloop(mpath)):
print i,getBigFileMd5(i)
if __name__ == '__main__':
main()
PS:
Hash_1.0.4.exe以及使用win自带
certutil -hashfile “D:\*.*” MD5
对于大文件都会处理很慢
OVER