前言
有个需求,需要把指定文件夹下的所有Excel文件拷贝到一起,重名的文件需重命名,不能覆盖。
为实现需求,需用到os
和shutil
模块。
- 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.copy2()介绍
shutil.copy2(src, dst, *, follow_symlinks=True)
功能介绍
- 类似于 copy(),区别在于 copy2() 还会尝试保留文件的元数据。
- 当 follow_symlinks 为假值且 src 为符号链接时,copy2() 会尝试将来自 src 符号链接的所有元数据拷贝到新创建的 dst 符号链接。 但是,此功能不是在所有平台上均可用。 在此功能部分或全部不可用的平台上,copy2() 将尽量保留所有元数据;copy2() 一定不会由于无法保留文件元数据而引发异常。
- copy2() 会使用 copystat() 来拷贝文件元数据。
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版权协议,转载请附上原文出处链接和本声明。