Python批量复制R008开头文件异常:首文件重复、文件夹数量不符
问题分析与修正方案
我来帮你拆解下代码里的问题,还有对应的修正方案~
为什么会出现这两个问题?
1. 第一个文件被复制两次(其实所有文件都被复制了两次)
你的代码在处理每个R008开头的文件时,做了两次重复的复制操作:
- 先把文件复制到基础日期文件夹(比如你输入15,就是
D:\destination_folder\15) - 紧接着因为这个基础文件夹已经存在了(刚创建或原本就有),你又创建了带序号的文件夹(比如
15_1),再把同一个文件复制过去
所以第一个文件会被复制两次,后面的每个文件其实也都被复制了两次,只是你可能只注意到了第一个的情况。
2. 4个文件生成5个文件夹
- 第一个文件夹是基础日期文件夹(
15),在处理第一个文件时创建 - 之后每个文件都会触发创建一个带序号的文件夹:第1个文件对应
15_1,第2个对应15_2,第3个15_3,第4个15_4 - 加起来就是1个基础文件夹 + 4个带序号的文件夹,总共5个
根据你的需求修正代码
我猜你可能有两种常见需求,分别对应不同的修正方案:
需求A:把所有R008开头的文件放到同一个日期命名的文件夹里
如果是这个需求,你不需要那些带序号的文件夹,把循环里多余的创建/复制代码删掉就行,而且文件夹只需要创建一次,不用在循环里重复判断:
import shutil import os source = 'D:\\source_folder\\' dest1 = 'D:\\destination_folder\\' folder_name = input("What day of the month? ") # 用os.path.join拼接路径更规范,避免系统路径分隔符出错 folder_path = os.path.join(dest1, folder_name) # 先创建目标文件夹,只执行一次 if not os.path.exists(folder_path): os.makedirs(folder_path) files = os.listdir(source) for file in files: if file.startswith('R008'): shutil.copy(os.path.join(source, file), folder_path)
需求B:每个R008开头的文件单独放到一个「日期+序号」的文件夹里
如果是想给每个文件分配一个单独的文件夹,那直接为每个文件生成带序号的文件夹,不需要基础日期文件夹:
import shutil import os source = 'D:\\source_folder\\' dest1 = 'D:\\destination_folder\\' folder_name = input("What day of the month? ") i = 1 files = os.listdir(source) for file in files: if file.startswith('R008'): # 为每个文件生成单独的文件夹路径 folder_path = os.path.join(dest1, f"{folder_name}_{i}") if not os.path.exists(folder_path): os.makedirs(folder_path) shutil.copy(os.path.join(source, file), folder_path) i += 1
这样4个文件会生成4个对应序号的文件夹,每个文件只复制一次,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Helma
相关产品推荐
相关产品推荐

