Python 代码优化:根据 .xlsm 文件名创建文件夹并复制文件
Python 代码优化:根据 .xlsm 文件名创建文件夹并复制文件
本文提供 Python 代码,根据目标文件夹中的 .xlsm 文件名,在目标文件夹中创建同名文件夹,并将文件复制到该文件夹。代码优化了逻辑,并处理了部分特殊情况,例如文件名包含“Copy of”。
import os
import shutil
path1 = '/path/to/source/folder'
path3 = '/path/to/destination/folder'
for file in os.listdir(path3):
if file.endswith('.xlsm'):
folder_name = os.path.splitext(file)[0] # 文件夹名称为去除后缀名的文件名
found_folder = False
prev_folder_path = None
for root, dirs, files in os.walk(path3):
if found_folder:
break # 如果已经找到同名文件夹,则退出循环
if folder_name in dirs:
src_folder = os.path.join(root, folder_name)
if 'Copy of ' in os.path.basename(src_folder):
continue # 如果找到的是复制的文件夹,则跳过
if found_folder and src_folder != prev_folder_path:
continue # 如果已经找到同名文件夹,但路径与之前不同,则跳过
rel_path = os.path.relpath(src_folder, path3)
dest_folder = os.path.join(path3, rel_path)
if not os.path.exists(dest_folder):
os.makedirs(dest_folder)
file_path = os.path.join(root, file)
shutil.copy(file_path, dest_folder)
found_folder = True
prev_folder_path = src_folder
if not found_folder:
found_file = False
filenames = [os.path.splitext(f)[0] for f in os.listdir(path1)] # 获取 path1 中所有文件的名称(不含后缀)
if folder_name in filenames:
src_folder = os.path.join(path1, folder_name)
if 'Copy of ' in os.path.basename(src_folder):
continue # 如果找到的是复制的文件夹,则跳过
if found_folder and src_folder != prev_folder_path:
continue # 如果已经找到同名文件夹,但路径与之前不同,则跳过
found_file = True
rel_path = os.path.relpath(src_folder, path1) # 获取 src_folder 与 path1 的相对路径
dest_folder = os.path.join(path3, rel_path) # 在 path3 下创建同样的子目录
if not os.path.exists(dest_folder):
os.makedirs(dest_folder)
file_path = os.path.join(path3, file)
shutil.copy(file_path, dest_folder)
prev_folder_path = src_folder
if not found_file:
dest_folder = os.path.join(path3, '没找到对应的文件路径')
if not os.path.exists(dest_folder):
os.makedirs(dest_folder)
file_path = os.path.join(path3, file)
shutil.copy(file_path, dest_folder)
代码说明:
- 遍历目标文件夹: 代码首先遍历目标文件夹
path3中的所有文件。 - 判断文件类型: 筛选出所有以 .xlsm 结尾的文件。
- 提取文件名: 从文件名中提取去除后缀的部分,作为目标文件夹的名称。
- 查找同名文件夹: 在目标文件夹中查找同名文件夹,并进行以下判断:
- 如果找到同名文件夹,则退出循环。
- 如果找到的是“Copy of”开头的文件夹,则跳过。
- 如果之前已经找到过同名文件夹,但路径不同,则跳过。
- 创建文件夹: 如果没有找到同名文件夹,则根据文件名在目标文件夹中创建同名文件夹。
- 复制文件: 将当前文件复制到新创建的文件夹中。
- 查找源文件夹: 如果在目标文件夹中没有找到同名文件夹,则在源文件夹
path1中查找同名文件。 - 创建文件夹: 如果在源文件夹中找到同名文件,则根据文件所在路径在目标文件夹中创建同名文件夹,并将文件复制到该文件夹。
- 处理未找到情况: 如果在目标文件夹和源文件夹中都没有找到同名文件,则创建一个名为“没找到对应的文件路径”的文件夹,并将文件复制到该文件夹。
代码优化:
- 代码添加了对“Copy of”文件夹的判断,防止将复制的文件夹作为目标文件夹。
- 代码添加了对已找到同名文件夹的判断,防止重复创建文件夹。
- 代码优化了文件夹创建和文件复制的逻辑,使其更加简洁。
使用说明:
- 将代码中的
path1和path3替换为实际的源文件夹路径和目标文件夹路径。 - 运行代码即可根据 .xlsm 文件名创建文件夹并复制文件。
注意:
- 代码仅适用于以 .xlsm 为后缀的文件。
- 代码假设源文件夹和目标文件夹中的文件名不重复。
- 代码中使用了
shutil.copy()函数来复制文件,如果需要其他复制方式,请修改代码。
希望本文能够帮助你更好地理解代码,并将其应用到实际项目中。
原文地址: https://www.cveoy.top/t/topic/nDmE 著作权归作者所有。请勿转载和采集!