Python 把指定文件夹及其所有子文件夹下的文件汇总到一个文件夹下

前言

有个需求,需要把指定文件夹下的所有Excel文件拷贝到一起,重名的文件需重命名,不能覆盖。

为实现需求,需用到osshutil模块。

  • os.walk是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
  • shutil 模块提供了一系列对文件和文件集合的高阶操作。 特别是提供了一些支持文件拷贝和删除的函数。

os.walk()介绍

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

参数

  • top 是所要遍历的文件夹的地址
  • topdown 可选,为True(默认为开启),则优先遍历top目录,否则优先遍历top的子目录。如果topdown参数为True,walk会遍历top文件夹与top文件夹中每一个子目录。
  • onerror 可选,需要一个callable对象,当walk需要异常时,会调用。
  • followlinks 可选,如果为True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。

返回值
返回的是一个三元组(root,dirs,files)

  • root 是当前正在遍历的这个文件夹的地址
  • dirs 是一个 list ,内容是该文件夹中所有的「子文件夹」的名称(不包括子目录)
  • files 同样是 list , 内容是该文件夹中所有的「文件」的名称(不包括子目录)

shutil.copy()介绍

shutil.copy(src, dst, *, follow_symlinks=True)
功能

  • 将文件 src 拷贝到文件或目录 dst。 src 和 dst 应为 路径类对象 或字符串。 如果 dst 指定了一个目录,文件将使用 src 中的基准文件名拷贝到 dst 中。 将返回新创建文件所对应的路径。
  • 如果 follow_symlinks 为假值且 src 为符号链接,则 dst 也将被创建为符号链接。 如果 follow_symlinks 为真值且 src 为符号链接,dst 将成为 src 所指向的文件的一个副本。

copy() 会拷贝文件数据和文件的权限模式 (参见 os.chmod())。 其他元数据,例如文件的创建和修改时间不会被保留。

执行结果示例
shutil.copy()执行结果

shutil.copy2()介绍

shutil.copy2(src, dst, *, follow_symlinks=True)

功能介绍

  • 类似于 copy(),区别在于 copy2() 还会尝试保留文件的元数据。
  • 当 follow_symlinks 为假值且 src 为符号链接时,copy2() 会尝试将来自 src 符号链接的所有元数据拷贝到新创建的 dst 符号链接。 但是,此功能不是在所有平台上均可用。 在此功能部分或全部不可用的平台上,copy2() 将尽量保留所有元数据;copy2() 一定不会由于无法保留文件元数据而引发异常。
  • copy2() 会使用 copystat() 来拷贝文件元数据。

copy2()执行结果示例
shutil.copy2()执行结果示例

需求实现

import shutil,os

origin_path = '/Users/ash/project/a'
target_path = '/Users/ash/project/b'

for o_dir, sub_f, files in os.walk(origin_path):
    # print('o_dir: ', o_dir) # 当前文件夹「路径」的字符串
    # print('sub_f: ', sub_f) # 当前文件夹的「子文件夹的列表」
    # print('files: ', files) # 当前文件夹的「文件名称的列表」
    
    for i in range(len(files)):
        if files[i].endswith(('.xls','.xlsx','.csv')): 
            file_path = o_dir + '/' + files[i]
            temp_file_name = o_dir.replace(origin_path, '').replace('/', '_')
            if len(temp_file_name) > 1:
                temp_file_name = temp_file_name[1:len(origin_path)] + '_'
            new_path = target_path + '/' + temp_file_name + files[i]
            shutil.copy2(file_path, new_path)
            

版权声明:本文为qq814889301原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。