1.复制文件
import os
from shutil ipmort copy,copytree
path = os.path.join(os.getcwd(),'test1.txt')
target_path = os.path.join(os.getcwd(),'test1copy')
copy(path,target_path)
copytree(path,target_path)
注意:test1.txt 和 test1copy 文件夹/包 都点存在
os.path.join(os.getcwd(), 'test1.txt') 这行代码主要是用于构建一个文件的完整路径
getcwd 就是返回当前路径 类似 linux 的cwd 命令 返回当前路径
os.path.join 是os模块中的一个函数 作用是将多个路径组合成一个完整的路径
与string拼接不同的是 这个函数会根据不同的操作系统自动处理路径分隔符(在 Windows 系统中是 \
,在 Linux 和 macOS 系统中是 /
),确保生成的路径是符合当前操作系统规范的。
copytree 就是复制所有文件
2. 文件的压缩/解压
# 文件的压缩
# 参1 :压缩文件名字
# 参2 :压缩格式,如zip,tar,gztar等
# 参3 :要压缩的文件夹路径/地址
zipfile = make_archive('test1copyzip','zip',os.path.join(os.getcwd(), 'test1copy'))
print(zipfile)
# 文件的解压
# 参1 :压缩文件名字
# 参3 :解压路径/地址
target = os.path.join(os.getcwd(), 'test2')
unpack_archive('test1copyzip.zip',target)
print('文件解压成功!')
主要用到的 包就是 make_archive 和 unpack_archive
3. 文件夹剪切
# 文件夹剪切
# 参数1:目标 注意目标不存在会报错
# 参数2: 剪切的位置(剪切到哪里去)
move('test2','test1move')
4.文件夹删除
# 文件夹删除
rmtree('test2copy')
5. 查找文件
import os
from glob import glob
# 1.查找文件
target = os.getcwd()
# 1.1获取当前目录下的所有文件
result = glob(target +'/*')
glob 就会返回一个列表 包含 你拼接的路径下的所有文件 * 可变 * 代表多个 ?代表一个
6.查找文件目录中指定的文件
import glob
import os
# 凭借路径 这里是 当前路径下所有文件
path = os.path.join(glob.os.getcwd(),'*')
# 初始化列表 要查找的文件可能有多个
fianl_result = list();
# 构建函数需要遍历所有目录 使用递归
def search(path,target):
# glob.glob 就会返回 path路径下的所有文件 以列表的形式
result = glob.glob(path)
# 我们遍历 result
for data in result:
# 判断是否是文件夹 如果是文件夹的话我们就使用递归继续遍历
if os.path.isdir(data):
# 拼接路径 后续通过 glob.glob 就可以获得所有文件
_path = os.path.join(data,'*')
# 开始递归
search(_path,target)
else:
if target in data:
# 如果包含目标文件
final_result.append(data)
return fianl_result
if __name__ == '__main__':
result = search(path,"test1.txt")
print(result)
7. 查找指定内容
# 需求:对文件中的内容进行匹配查找,包含指定内容则查找出来
# 已知条件:文件会包含的指定内容,不知道文件名以及所有目录,只知道根目录
# 实现思路:利用glob从最外层开始查找 遍历根目录下所有文件,判断文件是否包含指定内容
import glob
import os
path = os.path.join(os.getcwd(),'*')
final_result = list()
def search(path,target):
result = glob.glob(path)
for data in result:
if os.path.isdir(data):
_path = os.path.join(data,'*')
search(_path,target)
else:
# open 函数的功能用于打开文件
# 参数1 文件的位置
# 参数2 操作文件的方式 r 读取 w 输出 a 追加 b 二进制
# 参数3 编码方式,默认utf-8
f = open(data,'r',encoding='utf-8')
try:
content = f.read()
if target in content: # 包含指定内容则加入到最终结果中
final_result.append(data)
except:
print('data read exception:%s' % data)
continue
finally:
f.close()
return final_result
if __name__ == '__main__':
result = search(path,'他们朝我扔泥巴')
print(result)
# 与查找文件类似 加了一个如果是文件的话 我们就打开 然后获得内容 判断内容是不是在当前这个文件里 如果在那么就 加到列表中
# 在你提供的代码上下文中,path
# 是通过
# os.path.join(os.getcwd(), '*')
# 生成的,这意味着
# path
# 是当前工作目录下的所有文件和目录的路径模式。因此,result = glob.glob(path)
# 会返回一个包含当前工作目录下所有文件和目录路径的列表,并将其赋值给变量
# result
8.清理重复的文件(这里的判断重复是 如果名字相同并且大小一样就算重复)
import glob
import hashlib
import os.path
data = dict() # 字典
def clear(path):
result = glob.glob(path)
for _data in result:
if os.path.isdir(_data):
_path = os.path.join(_data,'*') # 获得这个子目录下的所有文件路径
clear(_path) # 递归到子目录下
else:
# 获取这个文件的名子
# os.path.split 这个函数 将一个路径拆解成两部分 目录名和文件名部分 最后一个就是文件名
name = os.path.split(_data)[-1]
# 判断是否是二进制文件 初始false
is_byte = False
if 'zip' in name:
is_byte = True
f = open(_data,'rb')
else:
f = open(_data,'r',encoding='utf-8')
content = f.read()
f.close()
if is_byte:
# 使用hashlib的md5方法读取文件
hash_content_obj = hashlib.md5(content)
else:
hash_content_obj = hashlib.md5(content.encode('utf-8')) # 利用hashlib的MD5方法读取文件
hash_content = hash_content_obj.hexdigest() # 获取文件的hash值
if name in data: # 判断名字是否包含
sub_data = data[name]
is_delete = False
for k,v in sub_data.items():
if v == hash_content:
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 = os.path.join(os.getcwd(),'*')
clear(path)
for k,v in data.items():
for _k,v in v.items():
print(_k,v)
9.批量修文件名
import glob
import shutil
import os
def update_name(path):
result = glob.glob(path)
# 遍历枚举数据,index是自动生成的索引值 data遍历的元素
for index,data in enumerate(result):
if os.path.isdir(data):
_path = os.path.join(data,'*')
update_name(_path)
else:
# 获取文件名
path_list = os.path.split(data)
name = path_list[-1]
# 将索引值和文件名合成一个新的文件名
new_name = '%s_%s'%(index,name)
new_data = os.path.join(path_list[0],new_name)
shutil.move(data,new_data)
if __name__ == '__main__':
path = os.path.join(os.getcwd(),'test1copy','*')
# path += "\\test1copy"
update_name(path)