如何复制指定扩展名文件到新文件夹且避免覆盖,重命名重复文件?
解决KML文件复制时的同名覆盖问题
这个场景太常见了——批量复制文件时,最怕不小心把目标文件夹里已有的文件覆盖掉。我来帮你修改代码,实现**遇到同名文件时自动重命名为「filename-copy」格式(如果copy版本也存在,会自动递增编号)**的需求。
核心思路
我们需要先检查目标路径里是否已经存在同名文件:
- 如果不存在,直接复制;
- 如果存在,生成一个不会重复的新文件名(比如
filename-copy.kml,如果这个也存在就用filename-copy1.kml,以此类推),再执行复制操作。
修改后的完整代码
from qgis.core import * import glob, os, shutil, time, qgis def get_unique_filename(dest_dir, filename): """生成目标目录中不重复的文件名,避免覆盖""" # 拆分文件名和扩展名 name, ext = os.path.splitext(filename) # 初始候选路径 candidate_path = os.path.join(dest_dir, filename) # 如果文件不存在,直接返回原路径 if not os.path.exists(candidate_path): return candidate_path # 如果存在,开始生成带后缀的文件名 counter = 1 while True: # 构造新文件名:第一次是name-copy.ext,后续递增为name-copy1.ext、name-copy2.ext new_filename = f"{name}-copy{counter}{ext}" if counter > 1 else f"{name}-copy{ext}" new_path = os.path.join(dest_dir, new_filename) if not os.path.exists(new_path): return new_path counter += 1 path = r"C:\Temp\testinput" dest = r"C:\Temp\testoutput" for root, d_names, f_names in os.walk(path): for f in f_names: if f.endswith('.kml'): src = os.path.join(root, f) # 保留你原来的文件信息打印 print(time.strftime('%m/%d/%Y', time.gmtime(os.path.getmtime(src)))) print(os.path.realpath(src)) # 获取安全的目标文件路径 dest_file_path = get_unique_filename(dest, f) # 执行复制 shutil.copy2(src, dest_file_path) # 可选:打印复制后的路径,方便验证结果 print(f"已复制到:{dest_file_path}")
代码说明
辅助函数
get_unique_filename:- 专门处理文件名去重逻辑,自动检测目标目录的已有文件,生成不会重复的新名称;
- 支持多次同名场景:比如原目录有3个
test.kml,目标目录会依次生成test.kml、test-copy.kml、test-copy1.kml。
主逻辑修改:
- 不再直接调用
shutil.copy2(src, dest),而是先通过辅助函数拿到安全的目标路径,再执行复制; - 保留了你原来的文件信息打印,还新增了复制后路径的输出,方便你验证复制结果。
- 不再直接调用
这样修改后,就完全不用担心覆盖目标文件夹里的已有文件啦!
内容的提问来源于stack exchange,提问作者Apmartin
相关产品推荐
相关产品推荐

