You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:00:59