文章
将指定目录下的文件转移或复制到另一目录,示例代码如下:
import shutil
import re
import os
# 获取指定目录下的文件名 返回文件名列表 ori_path为初始指定目录地址
def get_file_names(ori_path):
# 获取指定目录下的文件名
file_names = os.listdir(ori_path)
# 打印文件名进行查看
# print("file_names:\n",file_names)
# 打印指定目录下的文件数目
print("num of files:",len(file_names))
# 将文件名列表返回
return file_names
# 使用正则表达式 筛选文件名 返回文件名列表 file_names为传入的文件名列表 format为正则表达式,是可选参数
def filename_filter(file_names,format='.*'):
# filenames用于存储筛选后的文件名
filenames = []
for filename in file_names:
# 使用正则表达式筛选文件名
temp = re.search(rf'{format}',filename)
# 若匹配成功,则继续执行
if temp:
# 将筛选后的文件名存入filenames
filenames.append(temp.group(0))
# 打印筛选后的文件名数量
print("num of files after filting:",len(filenames))
# 打印筛选后的文件名进行查看
# print("filenames:\n",filenames)
# 返回筛选后的文件名列表
return filenames
# 组合路径和文件名进行文件的复制或转移 ori_path为初始指定目录地址 des_path为目标目录地址 filenames为筛选后的文件名列表
def change_dir(ori_path,des_path,filenames):
# 遍历将文件移入指定目录地址
for filename in filenames:
if not os.path.isfile(ori_path+filename):
print("%s not exist!" % (ori_path+filename))
else:
# 若路径不存在则创建路径
if not os.path.exists(des_path):
os.makedirs(des_path) # 创建路径
# shutil除了有copy方法之外,还有move方法可以直接将数据剪切到指定目录,使用方法和copy方法一样
shutil.copy(ori_path + filename, des_path + filename) # 移动文件
print("copy %s -> %s" % (ori_path + filename, des_path + filename))
if __name__=="__main__":
# ori_path为初始指定目录地址
ori_path = "D:/jupyter_notebook/learning_keras/image/train/" # 注意路径最后要加/
# des_path为目标目录地址
des_path = "D:/jupyter_notebook/learning_keras/image/train/dog/" # 注意路径最后要加/
# 获取指定目录下的文件名
file_names = get_file_names(ori_path)
# 筛选文件 默认情况不指定format参数的话是不进行筛选的
# filenames = filename_filter(file_names)
# 指定format参数筛选文件名
filenames = filename_filter(file_names,format='dog.[0-9]{0,5}.jpg')
# 组合路径和文件名进行文件的复制或转移
change_dir(ori_path,des_path,filenames)
tips
shutil
除了有copy方法之外,还有move方法可以直接将数据剪切到指定目录,使用方法和copy方法一样。- 正则表达式忘了的话,可以在Python 正则表达式和r2coding快速学习使用。