1.基础-普通文件操作
1. shutil文件操作模块
文件的复制
- 复制文件
from shutil import copy
copy("复制文件路径","目标位置")
- 文件内容的复制
from shutil import copyfile
copyfile(来源文件,目标文件)
文件的剪切
可用于文件和文件夹
from shutil import move
move("源文件地址","目标地址")
文件的删除
from os import remove
remove("目标地址")
文件的压缩与解压
- 压缩
- 解压
# coding:utf-8 import shutil import os copy_file=os.path.join(os.getcwd(),"shutill_test.py") #shutil.copy(copy_file,os.path.join(os.getcwd(),"shutill_test1.py")) #shutil.copyfile(copy_file,os.path.join(os.getcwd(),"shutill_test1.py")) #shutil.move(os.path.join(os.getcwd(),"shutill_test1.py"),os.path.join(os.getcwd(),"shutill_test2.py")) #shutil.make_archive("demo1","zip",os.path.join(os.getcwd(),"demo1")) shutil.unpack_archive(os.path.join(os.getcwd(),"demo1.zip"),os.path.join(os.getcwd(),"demo1"))
文件夹的复制
from os import copytree
copytree("复制文件夹地址","目标地址")
文件夹的删除
from os import rmtree
copytree("文件夹地址")
2. glob文件与文件夹获取模块
介绍:glob是一个快速查找文件中内容的包,我们可以通过模糊查找的形式找到我们想要的内容;
使用: from glob import glob
glob(任意目录) 返回指定路径下的内容列表,不存在路径返回空列表
查找指定的文件
- 使用glob方法
2.递归文件夹进行查找
# coding:utf-8 from glob import glob import os #查找文件 reslut = [] def search(path,trage=""): #获取文件夹下的所有文件 pathAll=glob(path+"/*") #循环文件,判断是否是文件夹和文件 for p in pathAll: #判断是否是文件夹 if os.path.isdir(p): print("这是一个文件夹:" + p) #递归查找 search(p, trage) else: print("这是一个文件:"+p) if trage in p: reslut.append(p) return reslut if __name__ == '__main__': path=os.getcwd() result=search(path,"shutil") print("查找结果:",result)
查找指定内容的文件
#查找指定内容的文件 reslut_content = [] def search_content(path,content=""): #获取文件夹下的所有文件 pathAll=glob(path+"/*") #循环文件,判断是否是文件夹和文件 for p in pathAll: #判断是否是文件夹 if os.path.isdir(p): #递归查找 search_content(p, content) else: #读取文件 f=open(p,"r") try: c=f.read() if content in c: reslut_content.append(p) except: print("无法读取文件:",p) continue finally: #关闭刘 f.close() return reslut_content
if __name__ == '__main__': path=os.getcwd() result=search_content(path,"11") print("查找结果:",result)
清理重复文件
# coding:utf-8 import os from glob import glob import hashlib #查找重复文件 #1.递归遍历所有文件 #2.读取文件中的内容,将文件内容使用md5进行存储,如存在则删除,如不存在新增 #存储结构{"name":{"/name":"内容,"/name":"内容}} #相同名称放入一级, 二级存放所有名称相同的路径和内容的md5 file_dict={} def clear(path): #获取所有文件 path_all=glob(path+"/*") for p in path_all: if os.path.isdir(p): #文件夹递归调用下一个方法 clear(p) else: #如果为文件,读取文件内容 #如果为zip文件,则使用rb读取 try: name=os.path.split(p)[-1] if_byte=False if ".zip" in name: #进行byte的读取,返回的是byte类型 f=open(p,"rb") if_byte=True else: f=open(p,"r",encoding="utf-8") content=f.read() if if_byte: hash_content = hashlib.md5(content).hexdigest() else: hash_content=hashlib.md5(content.encode("utf-8")).hexdigest() f.close() if name in file_dict: #如果已经添加过则遍历里面的内容是否相同 subdict=file_dict[name] if_del=False for k,v in subdict.items(): if v == hash_content: os.remove(p) if_del=True #如果没有被删除则放入字典中 if if_del==False: file_dict[name][p] =hash_content else: #存放内容 file_dict[name]={p: hash_content} except: print("异常") if __name__ == '__main__': clear(os.getcwd()) print("file_dict:",file_dict)
1.查找重复文件 #1.递归遍历所有文件
2.读取文件中的内容,将文件内容使用md5进行存储作为key存储,路径保存
3.返回过滤掉数量小于于1的md5
# coding:utf-8 import os from glob import glob import hashlib #查找重复文件 #1.递归遍历所有文件 #2.读取文件中的内容,将文件内容使用md5进行存储作为key存储,路径保存 #3.返回过滤掉数量小于于1的md5 #存储结构{"md5":["路径“,"路径"]} #key存放md5值,value:存放路径 file_dict={} file_dict_reslut={} def search_repeat(path): #获取所有文件 path_all=glob(path+"/*") for p in path_all: if os.path.isdir(p): #文件夹递归调用下一个方法 search_repeat(p) else: #如果为文件,读取文件内容 #如果为zip文件,则使用rb读取 try: name=os.path.split(p)[-1] if_byte=False # 进行byte的读取,返回的是byte类型 f = open(p, "rb") if_byte = True content=f.read() if if_byte: hash_content = hashlib.md5(content).hexdigest() else: hash_content=hashlib.md5(content.encode("utf-8")).hexdigest() f.close() #存放内容 if hash_content in file_dict: file_dict[hash_content].append(p) else: file_dict[hash_content]=[p] except: print("异常") # 循环判断数量大于1的为存在重复文件 for k, v in file_dict.items(): if len(v) > 1: file_dict_reslut[k]=v if __name__ == '__main__': search_repeat("E:\python学习\第07周 Python办公自动化") print("file_dict:",file_dict) print("file_dict_reslut:", file_dict_reslut)
批量更新文件
# coding:utf-8 from glob import glob import os import shutil #批量更新文件名 #批量在文件后追加文件名 def batch_update_filename(path,append_name): path_all=glob(path+"/*") for p in path_all: if os.path.isdir(p): #如果是文件夹则递归 batch_update_filename(p) else: #获取文件名 f_split=os.path.split(p) old_name=f_split[-1] new_name=old_name+append_name shutil.move(p,os.path.join(f_split[0],new_name)) if __name__ == '__main__': batch_update_filename("D:/PycharmProjects/file_demo/file_demo/demo1","qqxxxxx")