Python文本文件数据提取代码仅提取部分行,求修改方案
问题分析与代码修改建议
原代码存在以下几个核心问题导致无法提取所有符合规则的行:
- 正则表达式匹配逻辑受限:
FAU([^"]*)仅匹配FAU后直到第一个双引号的内容,若目标内容未用双引号包裹、或一行内存在多个FAU/AD项,会直接漏匹配。 - 无结果持久化:仅逐行打印匹配内容,未统一存储所有提取数据,后续无法复用。
- 异常处理过于宽泛:会掩盖文件读取之外的其他错误(如正则语法问题)。
修改后的代码
import re fname = input("Enter the filename: ") all_extractions = [] # 存储所有提取结果的列表 try: # 使用with语句自动管理文件句柄,避免资源泄漏 with open(fname, 'r', encoding='utf-8') as fhand: for line in fhand: line = line.strip() # 根据实际格式选择对应的正则: # 场景1:字段值用双引号包裹(支持一行多个匹配) fau_matches = re.findall(r'FAU"([^"]*)"', line) ad_matches = re.findall(r'AD"([^"]*)"', line) # 场景2:字段值无引号,直到下一个标记(如FAU/AD)或行尾 # fau_matches = re.findall(r'FAU\s*(.*?)(?=\s+AD|$)', line) # ad_matches = re.findall(r'AD\s*(.*?)(?=\s+FAU|$)', line) # 将匹配结果存入统一列表,标记字段类型 if fau_matches: all_extractions.extend([("FAU", item) for item in fau_matches]) if ad_matches: all_extractions.extend([("AD", item) for item in ad_matches]) # 输出所有提取结果 print("所有提取内容:") for tag, content in all_extractions: print(f"{tag}: {content}") except FileNotFoundError: print("文件未找到,请检查文件名或路径是否正确") except Exception as e: print(f"处理过程出错:{str(e)}")
关键修改说明
- 正则表达式优化:
- 针对双引号包裹的字段:使用
r'FAU"([^"]*)"',精准提取双引号内的内容,同时支持一行内多个FAU/AD项的匹配。 - 针对无引号的字段:使用正向预查语法
(?=\s+AD|$),匹配到下一个标记或行尾就停止,避免误匹配其他字段内容。
- 针对双引号包裹的字段:使用
- 结果统一存储:用
all_extractions列表保存所有提取项,方便后续写入文件、数据分析等操作。 - 异常处理细化:单独捕获
FileNotFoundError,其他异常单独提示,避免掩盖未知问题。 - 资源管理优化:使用
with语句自动关闭文件,避免手动管理文件句柄的疏漏。
调试建议
如果仍有漏匹配的情况,可以在循环中加入未匹配行的打印,快速定位格式问题:
# 在line.strip()后添加 if not fau_matches and not ad_matches: print(f"未匹配的行:{line}")
内容的提问来源于stack exchange,提问作者ravi.g teja
相关产品推荐
相关产品推荐

