Python:55行代码实现复制文件夹下面所有特定文件(如.py、.exe、.html......)

实现复制文件夹下面所有特定文件(如.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文件
在这里插入图片描述
注意:这个代码还有一点缺点,就是创建了多余的文件夹。

发布了51 篇原创文章 · 获赞 299 · 访问量 9187

猜你喜欢

转载自blog.csdn.net/qq_45404396/article/details/104457650
今日推荐