实现复制文件夹下面所有特定文件(如.py、.exe、.html…)
为了实现这个功能,首先我们要导入这两个模块:os、os.path
import os
import os.path as ph
需要一条你想复制的文件夹的绝对路径:在代码里我用
path1代指,还需要一条你想复制到哪个文件夹下面的路径:在代码里我用path2代指。
为了实现复制这个功能,首先我们需要得到所需要创建的文件夹的路径和文件的路径,在代码中我定义了一个函数get_file_path,用来得到以上两个数据,用列表返回。
def get_file_path(path1,list2,list4): # 递归
list_1=os.listdir(path1) #当前目录下有哪些文件和子目录
for i in range(len(list_1)):
list_1[i]=ph.join(path1,list_1[i]) #将目录名和文件或文件名组成一个路径
if ph.isfile(list_1[i]): # 如果该条路径下为一个文件
list2.append(list_1[i])
else:
list4.append(list_1[i])
get_file_path(list_1[i],list2,list4)
之后就是创建文件夹了,这里我用list4来一个个创建,因为os.mkdir这个方法有一定的限制,如果前一级的那个文件夹还没有创建,就创建后面那个文件,这样会报错,为此,需要对list4进行一下升序排序,排序依据是根据一个路径中’\'个数的多少,之后再进行创建,这样就没有问题了。
def mk_dri(list4,path2):
list4.sort(key=lambda x:x.count('\\'))
files_name=list4[0]
files_name=files_name[files_name.rfind('\\')+1:]
path2=path2+'\\'+files_name
for i in range(len(list4)):
str_1=list4[i]
str_2=path2+str_1[str_1.find(files_name)+len(files_name):]
list4[i]=str_2
os.mkdir(list4[i])
下面就是复制相应的文件了,因为前面我已经将相应的文件夹已经创建,这下再来复制相应的文件就变得简单多了,只要判断原路径下的(后缀名)是否为我们要求的后缀名即可。
def handle_list2(list4,list2,path2,key_word):
files_name = list4[0]
files_name = files_name[files_name.rfind('\\') + 1:]
path2=path2+'\\'+files_name
list2.sort(key=lambda x:x.count('\\'))
for i in range(len(list2)):
if key_word==ph.splitext(list2[i])[1]:
str_1=list2[i]
str_2=path2+str_1[str_1.find(files_name)+len(files_name):]
print('正在复制文件%s到%s当中'%(list2[i],str_2))
with open(list2[i],'rb') as f:
content=f.read()
with open(str_2,'wb') as f:
f.write(content)
代码中如果有一些方法不了解的,可以看以下这个表格
方法名 | 含义 |
---|---|
os.path.isfile(path) | 判断指定路径是否存在且是一个文件 |
os.mkdir(path) | 用于创建文件夹,如果文件夹存在,则会抛出FileExistsError异常 |
os.path.join(path1,path2) | 将path1和path2各部分组合成一个路径名 |
代码如下:
import os
import os.path as ph
def get_file_path(path1,list2,list4): # 递归
list_1=os.listdir(path1) #当前目录下有哪些文件和子目录
for i in range(len(list_1)):
list_1[i]=ph.join(path1,list_1[i]) #将目录名和文件或文件名组成一个路径
if ph.isfile(list_1[i]): # 如果该条路径下为一个文件
list2.append(list_1[i])
else:
list4.append(list_1[i])
get_file_path(list_1[i],list2,list4)
def mk_dri(list4,path2):
list4.sort(key=lambda x:x.count('\\'))
files_name=list4[0]
files_name=files_name[files_name.rfind('\\')+1:]
path2=path2+'\\'+files_name
for i in range(len(list4)):
str_1=list4[i]
str_2=path2+str_1[str_1.find(files_name)+len(files_name):]
list4[i]=str_2
os.mkdir(list4[i])
def handle_list2(list4,list2,path2,key_word):
files_name = list4[0]
files_name = files_name[files_name.rfind('\\') + 1:]
path2=path2+'\\'+files_name
list2.sort(key=lambda x:x.count('\\'))
for i in range(len(list2)):
if key_word==ph.splitext(list2[i])[1]:
str_1=list2[i]
str_2=path2+str_1[str_1.find(files_name)+len(files_name):]
print('正在复制文件%s到%s当中'%(list2[i],str_2))
with open(list2[i],'rb') as f:
content=f.read()
with open(str_2,'wb') as f:
f.write(content)
if __name__ == '__main__':
list2=[];list4=[]
path1=input('请输入你想复制的文件夹的绝对路径:')
list4.append(path1)
get_file_path(path1,list2,list4)
path2=input('请输入你想复制到哪个文件夹下面(绝对路径):')
mk_dri(list4,path2)
key_word = input('请输入你想复制文件的后缀名:')
handle_list2(list4,list2,path2,key_word)
如我想将D盘上Pycharm文件夹下面的.py文件全部复制到 E:\垃圾 下面
运行结果:
可发现只复制了.py文件
注意:这个代码还有一点缺点,就是创建了多余的文件夹。