请求修改Python文件迁移代码,实现特定文件名筛选迁移
问题分析与解决方案
你的代码核心问题是:筛选条件的if语句只做了打印,实际的文件复制、添加到rasters/mosaic列表的操作都在if块外面,不管文件是否符合筛选条件,这些操作都会执行,所以才会迁移文件夹里的全部文件。
下面针对你的需求提供两种修改方案:
方案1:按文件名中的日期筛选(支持指定日份或完整日期)
如果要按日期日份筛选(比如只迁移日份为14的文件),或者按完整日期(如2017-10-14)筛选,需要先统一日期字符串的格式,再把所有操作放到if判断内部:
# 按日期筛选迁移指定文件 import os import shutil from datetime import datetime, timedelta def movefiles(folder, ctr, stop): print('moving') # 定义日期格式,和文件名里的日期格式保持一致 date_format = '%Y-%m-%d' for i in range(0, stop): day_delta = ctr.date + timedelta(days=i) # 把datetime对象转成和文件名一致的字符串格式 target_date_str = day_delta.strftime(date_format) # 如果只想筛选日份,比如只找14号的文件,用下面这行替换上面的target_date_str # target_day = str(day_delta.day) src_fldr = r'path/source/folder' # 替换为实际源文件夹路径 src_items = os.listdir(src_fldr) for rci in src_items: # 跳过文件夹,只处理文件 if not os.path.isfile(os.path.join(src_fldr, rci)): continue rci_segments = rci.split('_') # 先判断文件名格式是否符合预期,避免索引越界 if len(rci_segments) < 2: continue output_folder = os.path.join(folder, rci_segments[0]) # 确保输出文件夹存在,避免复制失败 os.makedirs(output_folder, exist_ok=True) # 条件1:匹配国家代码;条件2:匹配完整日期(如果要匹配日份,改成rci_segments[1].split('-')[2] == target_day) if ctr.country in rci and rci_segments[1] == target_date_str: print(f'正在迁移: {rci}') local_filename = os.path.join(output_folder, f'del{rci}') try: shutil.copy(os.path.join(src_fldr, rci), local_filename) except Exception as e: print(f'迁移出错: {str(e)}') continue # 出错就跳过当前文件,继续处理下一个 out_rast = os.path.join(folder, rci_segments[0], rci) ctr.rasters.append([local_filename, out_rast]) # 这里的日期判断也需要统一格式 next_day_str = (ctr.date + timedelta(days=1)).strftime(date_format) if rci_segments[1] == next_day_str: ctr.mosaic.append(out_rast) print('-------------') return
关键修改点:
- 把文件复制、列表添加等核心操作全部放到
if判断块内部,只有符合条件的文件才会执行这些操作 - 统一日期字符串格式(用
strftime),避免datetime对象转字符串后格式不匹配导致筛选失效 - 增加了格式校验(判断文件名拆分后的段数)和文件夹判断,避免报错
- 自动创建输出文件夹,不用手动提前创建
方案2:匹配完整文件名
如果需要精确匹配指定的完整文件名(比如只迁移USA_2017-10-14_rci_box1.tif),可以直接判断文件名是否在目标列表中:
# 按完整文件名匹配迁移 import os import shutil from datetime import datetime, timedelta def movefiles(folder, ctr, stop): print('moving') # 定义要匹配的完整文件名列表 target_filenames = [ 'USA_2017-10-14_rci_box1.tif', # 可以添加更多目标文件名 ] src_fldr = r'path/source/folder' # 替换为实际源文件夹路径 src_items = os.listdir(src_fldr) for rci in src_items: # 跳过文件夹,只处理文件 if not os.path.isfile(os.path.join(src_fldr, rci)): continue # 判断当前文件名是否在目标列表中 if rci in target_filenames: print(f'正在迁移: {rci}') rci_segments = rci.split('_') output_folder = os.path.join(folder, rci_segments[0]) os.makedirs(output_folder, exist_ok=True) local_filename = os.path.join(output_folder, f'del{rci}') try: shutil.copy(os.path.join(src_fldr, rci), local_filename) except Exception as e: print(f'迁移出错: {str(e)}') continue out_rast = os.path.join(folder, rci_segments[0], rci) ctr.rasters.append([local_filename, out_rast]) # 如果需要日期相关的mosaic逻辑,保留原判断(注意统一日期格式) date_str = rci_segments[1] next_day_str = (ctr.date + timedelta(days=1)).strftime('%Y-%m-%d') if date_str == next_day_str: ctr.mosaic.append(out_rast) print('-------------') return
关键修改点:
- 直接判断文件名是否在
target_filenames列表中,符合条件才执行迁移操作 - 同样增加了文件/文件夹判断和自动创建输出文件夹的逻辑
内容的提问来源于stack exchange,提问作者bersuperG
相关产品推荐
相关产品推荐

