解析含文件列表的TXT文件 提取SDU、SCI目录及文件名用于本地比对
问题根因
- 原代码的
pathSDU、pathSCI变量赋值后不会主动清空,只要后续任意位置出现匹配的文件名,就会关联上最后一次记录的路径,没有校验当前是否真的处于对应目标目录下 - 两个目录判断分支独立运行,没有互斥逻辑,可能出现状态冲突
- 直接用整行作为字典key,行尾换行符、前后空白会导致后续比对失效
修改后可运行代码
import glob import os files_dict = {} for file_path in glob.glob('/foo/bar/catalog/*.txt'): # 每次处理新文件重置状态,避免跨文件污染 current_active_dir = None current_dir_path = "" print(f'opening file {file_path}') with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue # 跳过空行 # 判断是否是目录行 if line.endswith(':'): # 匹配SDU目标目录 if '/ACS/SDU_:' in line: current_active_dir = 'SDU' current_dir_path = line.rstrip(':') # 匹配SCI目标目录 elif '/ACS/ScienceDataFile:' in line: current_active_dir = 'SCI' current_dir_path = line.rstrip(':') # 其他目录,重置状态 else: current_active_dir = None current_dir_path = "" continue # 仅在目标目录内处理对应文件 if current_active_dir == 'SDU': if 'SDU__DACS' in line and 'manifest' not in line: # 提取纯文件名:按空格分割取最后一段 file_name = line.split()[-1] files_dict[file_name] = current_dir_path elif current_active_dir == 'SCI': if 'SCI__DACS' in line and 'manifest' not in line: file_name = line.split()[-1] files_dict[file_name] = current_dir_path
核心优化说明
- 新增状态标记
current_active_dir,只有当前明确处于SDU/SCI目录下时,才会处理对应格式的文件,遇到其他目录时自动清空状态,彻底避免跨目录关联 - 每次打开新文件自动重置所有状态,不会出现不同文件之间的状态串扰
- 自动处理行首尾空白、目录末尾的冒号,提取纯文件名作为字典key,后续和本地文件比对更方便
- 简化分支逻辑,避免原代码中两个独立if分支可能带来的冲突问题
内容的提问来源于stack exchange,提问作者stickmann
相关产品推荐
相关产品推荐

