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)
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)
# -*- coding:utf-8 -*-
import os
import hashlib
FILE_LIST = [] #所有文件列表
#获取目录下所有文件
def get_file_list(dir_path):
global FILE_LIST
dir_list = {}
if not os.path.isdir(dir_path):
print('目录不存在')
else:
dir_list = os.listdir(dir_path)
for file in dir_list:
file_path = dir_path + '\\' +file
if os.path.isdir(file_path):
get_file_list(file_path) #目录包含目录需读得里面的文件
else:
FILE_LIST.append(file_path)
#print(FILE_LIST)
#获取文件的md5的值
def get_file_md5(file_path):
def read_chunks(fh):
fh.seek(0)
chunks = fh.read(8096) #文件过大一块块读
while chunks:
yield chunks
chunks = fh.read(8096)
else: #最后将游标放回到文件头
fh.seek(0)
myhash = hashlib.md5()
with open(file_path,'rb') as fh:
for chunk in read_chunks(fh):
myhash.update(chunk)
return myhash.hexdigest()
#文件大小过滤及重命名
def file_operator(dir_path,size,file_size_unit):
count = 0
file_dict = {}
get_file_list(dir_path) #获取目录下所有文件
for file in FILE_LIST:
file_size = os.path.getsize(file)
if file_size_unit == 'Byte':
file_size = file_size
elif file_size_unit == 'KB':
file_size = file_size / 1024
elif file_size_unit == 'M':
file_size = file_size / 1024 / 1024
elif file_size_unit == 'G':
file_size = file_size / 1024 / 1024 / 1024
else:
print('文件单位默认为M处理')
ile_size = file_size / 1024 / 1024
file_size = round(file_size,2)
file_md5 = get_file_md5(file) #获取文件的md5码
file_path = os.path.split(file)
file_full_name = file_path[1] #获取文件的名称,不包含目录
count += 1
file_type = file_full_name[file_full_name.index('.'):] #获取文件的类型
#新目录名 = 目录+文件+文件md5码+记数+文件类型
new_name = file_path[0] + '\\' + str(file_md5) + '_' + str(count) + file_type
os.rename(file,new_name)
if(file_size > size): #过滤文件大小不足的
file_dict[new_name] = str(file_size) + file_size_unit
print('大小超过{0}{1}的文件列表为:\n{2}'.format(size,file_size_unit,file_dict))
if __name__ == '__main__':
file_operator(r'G:\test',10,'M')
欢迎来到testingpai.com!
注册 关于