Python实现.xlsx文件增量复制,避免重复覆盖问题求助
问题描述
我正在遍历一个包含多层子目录的主目录,希望将其中的.xlsx文件复制到新目录进行汇总。所有文件名称唯一,且每日都会新增文件。我需要脚本能够对比目标目录中已有的文件,仅复制新增的.xlsx文件,避免覆盖已复制的文件。例如:初始主目录有test1.xlsx和test2.xlsx,复制到目标目录;两天后主目录新增test3.xlsx,执行脚本时应仅复制该新增文件。
我尝试了一段代码,但文件仍会被覆盖,请求帮助解决该问题。附上尝试的代码:
import os import shutil from os.path import isfile #count = 0 for root, dirs, files in os.walk('Checklists'): for file in files: if file.endswith('.xlsx'): #print(file) if isfile('Checklist'): print("File exists") else: #print(os.path.join(root, file)) #count +=1 #print(count) #if not os.path.exists(os.path.join('Checklists', file)): shutil.copy(os.path.abspath(root + '/' + file), 'Checklist', follow_symlinks=True)
解决方案
原代码的核心问题是判断逻辑错误:isfile('Checklist')是检查名为Checklist的文件是否存在,但你的目标是目录,这个条件永远不成立,所以每次都会执行复制操作,覆盖已存在的文件。
正确的逻辑应该是:对每个找到的.xlsx文件,检查它在目标目录中是否已经存在,只有不存在时才复制。
修正后的代码如下:
import os import shutil # 定义源目录和目标目录 source_dir = 'Checklists' target_dir = 'Checklist' # 确保目标目录存在,不存在则创建 os.makedirs(target_dir, exist_ok=True) # 遍历源目录下所有子目录 for root, dirs, files in os.walk(source_dir): for file in files: if file.endswith('.xlsx'): # 构建源文件的完整路径 source_file_path = os.path.join(root, file) # 构建目标文件的完整路径 target_file_path = os.path.join(target_dir, file) # 检查目标文件是否已存在 if not os.path.exists(target_file_path): shutil.copy(source_file_path, target_file_path, follow_symlinks=True) print(f"已复制: {file}") else: print(f"已存在,跳过: {file}")
关键改进点
- 先确保目标目录存在,避免复制时因目录不存在报错
- 对每个
.xlsx文件,直接检查目标目录中该文件是否存在,而不是检查目标目录本身 - 使用
os.path.join拼接路径,避免手动拼接字符串出现的路径分隔符问题(比如Windows和Linux的差异) - 增加打印提示,方便查看执行状态
内容的提问来源于stack exchange,提问作者BertC
相关产品推荐
相关产品推荐

