1:获取当前目录下所有文件,然后做如下处理:
- 文件名去重复。
- 选出文件大于 10m 的
- 获取到文件的 md5 值,然后利用这个 md5 值对文件名进行重命名(其中 md5 代表一个文件属性)
- 打印出最后的符合条件的所有文件名
温馨提示:
- 我们是要获取所有的文件 而不是目录
- 去重复不是删除文件,而是对重复的文件名进行重命名
- 想办法获取文件的 md5 值
- 最好是函数的形式实现哦
1:获取当前目录下所有文件,然后做如下处理:
温馨提示:
import os
import hashlib
class MyFile:
'''文件夹类'''
def __init__(self, myPath):
self.rootPath = myPath
def del_files(self):
'''遍历文件夹'''
for root, dirs, files in os.walk(self.rootPath):#逐层遍历文件夹
for file in files:#遍历每一个文件
File1.append(os.path.join(root, file))#每一个文件放在总的列表下
fileSize = os.path.getsize(os.path.join(root, file))
if fileSize >= 10*1024*1024:
File2.append(os.path.join(root, file))
#文件名去重
for item in File1:
if item not in File3:
md = self.get_file_md5(item)
File3.append(item)
else:
self.get_file_md5(item)
File4.append(md)
def get_file_md5(slef, filename):
'''得到每个文件的md5'''
md5 = None
if os.path.isfile(filename):
f = open(filename, "rb")
fileMd5 = hashlib.md5()
fileMd5.update(f.read())
hashCode = fileMd5.hexdigest()
f.close()
md5 = str(hashCode).lower()
return md5
else:
print("这不是一个文件,请重新确认路径。")
return
if __name__ == '__main__':
File1 = [] # 获取所有带路径文件名
File2 = [] # 获取大于10M的带路径文件名
File3 = [] # 获取去重后的带路径文件名
File4 = [] # 存放重复名字md5
myFile = MyFile(r'C:\Users\admin\Desktop\柠檬班书籍')
myFile.del_files()
print("File1:", File1)
print("File2", File2)
print("File3", File3)
print("File4", File4)
# -*- coding: utf-8 -*-
# @Time : 2018/12/5 10:21
# @Author : Monica
# @Email : 498194410@qq.com
# @File : os_practice.py
import os
import hashlib
allfiles = []
templist = {}
end_file = []
class GetFlie:
def __init__(self, dirpath):
self.dirpath = dirpath
def get_all_file(self):
# 通过os.walk获取目录下的所有文件名
for root, dirs, files in os.walk(self.dirpath):
for file in files:
# 判断size
size = os.path.getsize(os.path.join(root, file))
if size >= 10485760:
# 文件名添加到allfiles列表里
allfiles.append(os.path.join(root, file))
# 重命名
for i in range(len(allfiles)):
# 如果md5在字典的key已存在
if self.get_md5(allfiles[i]) in templist.keys():
templist[self.get_md5(allfiles[i]) + str(i)] = allfiles[i].split(".")[0] + str(i) + "." + allfiles[i].split(".")[-1]
else:
templist[self.get_md5(allfiles[i])] = allfiles[i]
# 最后的文件
for file in templist.values():
end_file.append(file)
return end_file
@staticmethod
def get_md5(filename):
f = open(filename, 'rb')
m1 = hashlib.md5()
m1.update(f.read())
hash_code = m1.hexdigest()
f.close()
md5 = str(hash_code).lower()
return md5
if __name__ == '__main__':
path = r'I:\lesson_practice\tool'
print(GetFlie(path).get_all_file())
mport os
import hashlib
def filename_distinct(file_path):
# 获取目录下的所有文件并去重
files=[]
for root, dirs, file in os.walk(file_path):
'''file 为循环遍历的每一个目录下的文件,存储为列表形式'''
files+=file # 每个文件夹下的文件名列表相加,获取所有文件
# 对所有文件名去重并重命名重复的文件名,循环遍历,两两对比
for i in range(len(files)-1):
for j in range(i,len(files)-1):
if files[i]==files[j+1]: # 如果文件名重复
'''为重复的文件名中的一个重命名,加上循环遍历的 i,j 保证重命名后文件名不会再重复'''
files[i]=str(i)+str(j)+files[i]
# print('所有文件名——去重后:',files)
return files
def file_md5(file_path):
# 获取文件的 md5 属性
if os.path.isfile(file_path):
fp = open(file_path, 'rb')
contents = fp.read()
fp.close()
md5_1 = hashlib.md5(contents).hexdigest()
else:
print('file not exists')
return md5_1
def get_big_file(file_path,size):
# 获取大于指定 size 的文件,单位为 M
big_file=[]
for fpathe,dirs,fs in os.walk(file_path): # 遍历目录下的所有文件
for f in fs:
file_path=os.path.join(fpathe,f) # 文件的绝对路径
if os.path.getsize(file_path)>10241024size:
big_file.append(file_path) # 获取到大于 10M 的文件绝对路径列表
return big_file
if name == 'main':
file_path='C:\Users\liang\Desktop\新建文件夹'
bigfile=get_big_file(file_path,10)
print(filename_distinct(file_path))
print(bigfile)
md5file=[]
for file_name in bigfile:
md5file.append(file_md5(file_name))
print(md5file)
import os,hashlib
md5_list=[]
class GetFile:
def get_md5(self,file):
if os.path.isfile(file):
f = open(file,'rb')
md5_obj = hashlib.md5()#获取一个md5加密算法对象
md5_obj.update(f.read())#读取文件,制定需要加密的字符串
hash_code = md5_obj.hexdigest()#获取加密后的16进制字符串
f.close()
md5=str(hash_code).lower()#转为小写
return md5
def alter_file(self,directory):
list_dir=os.listdir(directory)#获取指定目录下的文件
for item in list_dir:#遍历目录下的文件
files_md5=self.get_md5(item)
md5_list.append(files_md5)
md5_set=set(md5_list)
for i in md5_set:
#判断md5个数是否大于1,做去重
if md5_list.count(i)>1 and os.path.getsize(item)>10*pow(1024,2):#判断文件的大小是否大于10M
file=os.path.splitext(item)#将文件拆成文件名和后缀
file_new=files_md5+file[1]#命名一个新文件
try:
os.rename(item,file_new)#文件替换
print("符合的文件有{0},修改为{1}".format(item,file_new))
except FileExistsError as e:
print(e)
break
if __name__ == '__main__':
#指定一个目录
path="F:\Python\python"
GetFile().alter_file(path)
欢迎来到testingpai.com!
注册 关于