shutil.copy(src, dst)
# src:连接的位置 ; dst:文件的名字
复制文件的内容和一些元数据。将test666.txt复制到test1copy。
import os # 找到本地文件
from shutil import copy # 操作文件
path = os.path.join(os.getcwd(),"test666.txt")
target = os.path.join(os.getcwd(),"test1copy")
copy(path,target) # 参数1:原 ; 参数2:目标
shutil.copyfile(src, dst)
只复制文件的内容(数据)。将test666.txt的内容复制到test1copy目录下的test2.txt中。
# 指向文件
import os
from shutil import copyfile
path = os.path.join(os.getcwd(),"test666.txt")
target_path = os.path.join(os.getcwd(),"test1copy/test2.txt")
copyfile(path,target_path)
shutil.move(src, dst)
将文件从一个位置移动到另一个位置(剪切操作)。
move("test1.txt","test1move/test1move.txt")
os.remove(path)
删除指定路径的文件。
os.remove('test1move/test1move.txt')
shutil.make_archive(base_name, format, root_dir, base_dir)
将目录或文件压缩成归档文件。
参数1:压缩文件名字;参数2:压缩文件类型;参数3/4:压缩文件地址
zipfile = make_archive('test1copyzip','zip',os.path.join(os.getcwd()),'test1copy')
shutil.unpack_archive(filename, extract_dir)
解压缩归档文件到指定目录。
target = os.path.join(os.getcwd(),'test2')
unpack_archive("test1copyzip.zip",target)
shutil.copytree(src, dst)
复制整个目录树(包括所有子目录和文件)。
参数1:目标;参数2:复制位置及名字
copytree('test1copy','test2copy')
shutil.move(src, dst)
将文件夹从一个位置移动到另一个位置(剪切操作)。
参数1:目标:注意目标不存在会报错;参数2:剪切的位置(到哪里去
move('test2','test1move')
shutil.rmtree(path)
递归删除整个目录树(包括所有子目录和文件)。
参数:删除的目标
rmtree('test2copy')
根据实际需求选择合适的 glob
模式。
import os
from glob import glob
target = os.getcwd()
result = glob(target+"/*") # 获取目录下所有文件
result = glob(target+"/*.py") # 获取目录下所有的扩展名是.py的文件
result = glob(target+"/2-文件夹的操作.py") # 获取目录下指定的文件
result = glob(target+"/test*") # 获取目录下以test开头的文件(模糊查询)
print(result)
需求:查找指定文件,根据文件名称在多层目录的环境中找到目标文件
已知条件:知道最外层目录地址,要查找的文件名
实现思路:利用glob从最外层目录开始查找,利用递归模式,逐层查找,直到找到目标
注意:由于要找的文件可能存在多个,因此使用列表的方式存放文件地址
import glob
path = glob.os.path.join(glob.os.getcwd(),'*')
final_result=[]
# 构建函数用于查找指定文件,由于需要遍历目录数,因此在该函数中采用递归的方式完成遍历
def search(path,target):
result = glob.glob(path)
for data in result:
if glob.os.path.isdir(data): #isdir()判断是否是文件夹,是则返回true,否则返回false
# 获得当前文件夹的地址
_path = glob.os.path.join(data,'*')
search(_path,target) # 递归方式,陆续向当前文件的内部查找文件
else:
if target in data: #判断查找的文件名是否匹配
final_result.append(data)# 将查找的文件信息存放在最后的结果中
return final_result # 返回最后的结果
if __name__ == '__main__':
result = search(path,'test1.txt')
print(result)
需求:对文件中的内容进行匹配查找,包含指定内容则查找出来
已知条件:文件中会包含指定内容,不知道文件的名以及所在目录,只知道最外层根目录
实现思路:利用glob从最外层目录开始查找,利用递归模式,逐层查找,对每一个文件的内容进行匹配
open()函数:
用于打开文件,并对文件的内容进行操作
参数1:文件的位置;参数2:操作文件的方式 r:读取 w:输出;参数3:读取时的字符集设置
import glob
path = glob.os.path.join(glob.os.getcwd(),'*')
final_result=[]
def search(path,target):
result = glob.glob(path)
for data in result:
if glob.os.path.isdir(data):
_path = glob.os.path.join(data,'*')
search(_path,target)
else:
f = open(data,'r',encoding='utf-8')
# print(data)
try:
content = f.read()
if target in content: # 如果文件的内容包含查询的内容,否则返回true
final_result.append(data)
except:
print('data read exception:%s' % data)
continue
finally:
f.close()
return final_result
if __name__ == '__main__':
result = search(path,target="aaaa")
print(result)
需求:去掉目录中重复的文件
已知条件:知道根目录地址
实现思路:1.从指定路径开始读取,利用glob读取每个文件夹中的文件,名称和大小
2.每次检测都判断是否读取过相同名称的文件,如果存在,进一步判断大小是否相同,如果相同则删除掉
import glob
import hashlib
import os
data = {}
def clear(path):
result = glob.glob(path)
for _data in result:
if glob.os.path.isdir(_data):
_path = glob.os.path.join(_data,'*')
clear(_path)
else:
name = glob.os.path.split(_data)[-1] # 获取文件名
is_byte = False
# 判断文件名中是否包含zip,如果包含则说明是二进制文件,需要通过rb进行读取
if 'zip' in name:
is_byte = True
f = open(_data,'rb')
else:
f = open(_data,'r',encoding='utf-8')
content = f.read()
f.close()
# 利用hashlib的md5方法读取文件
if is_byte:
hash_content_obj = hashlib.md5(content)
else:
hash_content_obj = hashlib.md5(content.encode('utf-8'))
hash_content = hash_content_obj.hexdigest()
# 判断名字是否包含
if name in data:
sub_data = data[name]
is_delete= False
for k,v in sub_data.items():
if v == hash_content:
glob.os.remove(_data)
is_delete = True
if not is_delete:
data[name][_data] = hash_content
else:
data[name] = {
_data:hash_content
}
if __name__ == '__main__':
path = glob.os.path.join(glob.os.getcwd(),'*')
clear(path)
for k,v in data.items():
for _k,v in v.items():
print(_k,v)
需求:通过程序将目录下的文件名字修改
已知条件:明确根目录、文件名以及需要修改的字符串
实现思路:通过循环,将目标字符串加入到文件名中
import glob
import shutil
def update_name(path):
result = glob.glob(path)
# 遍历枚举数据,index自动生成的索引值,data遍历的元素
for index,data in enumerate(result):
if glob.os.path.isdir(data):
_path = glob.os.path.join(data,'*')
update_name(_path)
else:
path_list = glob.os.path.split(data)
name = path_list[-1]
new_name = '%s_%s' % (index,name) # 将索引值和文件名合成一个新的文件名
new_data = glob.os.path.join(path_list[0],new_name)
shutil.move(data,new_data)
if __name__ == '__main__':
path = glob.os.path.join(glob.os.getcwd())
path += "\\test1copy"
update_name(path)