Python脚本提取00/20开头行异常:output2为空排障问询
问题分析与修复方案
嘿,看起来你在提取以00和20开头的行时遇到了一半正常、另一半输出为空的问题,结合你给出的代码片段和描述,我来拆解下大概率的问题点,再给你一个靠谱的实现参考:
可能踩的坑
从你说的现象(00开头行正常导出,20开头行输出空)来看,常见的问题无非这几个:
- 匹配逻辑漏了
20分支:比如你写正则的时候只写了匹配^00的规则,完全没处理20的情况;或者用if-else的时候,只写了00的分支,20的部分根本没执行。 - 文件指针没重置:如果你的代码是先读一遍文件提取
00行,然后用同一个文件对象继续读20行,这时候文件指针已经在末尾了,自然读不到内容。 - 输出文件处理错误:比如打开
output2的时候用了错误的模式(比如'r'只读),或者写完没关闭文件(导致内容没刷入磁盘)。
修复后的完整代码
我给你写一个简洁且不容易出错的版本,你可以对比自己的代码找差异:
import sys import glob import os def DataExtract(inputfilename): # 用with语句自动管理文件,不用手动close output_00 = f"output_{os.path.basename(inputfilename)}_00.txt" output_20 = f"output_{os.path.basename(inputfilename)}_20.txt" with open(output_00, 'w', encoding='utf-8') as out1, \ open(output_20, 'w', encoding='utf-8') as out2, \ open(inputfilename, 'r', encoding='utf-8') as infile: for line in infile: # 先去掉首尾的换行/空格(如果你的行开头没有多余空格的话可以跳过) stripped_line = line.strip() if stripped_line.startswith('00'): out1.write(line) # 保留原行的换行符,用line而不是stripped_line elif stripped_line.startswith('20'): out2.write(line) # 你说所有行都是00或20开头,这里不用处理其他情况 # 遍历所有txt文件处理 listfiles = glob.glob('*.txt') for file in listfiles: DataExtract(file)
关键细节提醒
- 用
startswith替代正则:既然行是固定的00/20开头,完全没必要用re模块,str.startswith()更高效也更直观,除非你需要匹配更复杂的规则(比如00后面必须跟数字)。 - 不要重复读取文件:如果你的代码是先读一遍文件存成列表,再分别筛选
00和20,那没问题;但如果是同一个文件对象读完00后直接读20,一定要加infile.seek(0)把指针重置到文件开头。 - 编码要统一:打开文件时指定
encoding='utf-8',避免不同系统下的乱码问题,也能保证写入的内容正常保存。 - 调试小技巧:如果还是找不到问题,可以在
elif stripped_line.startswith('20')下面加一行print(f"找到20开头行: {repr(line)}"),看看控制台有没有输出——如果有输出但文件为空,那就是文件写入的问题;如果没输出,那就是匹配逻辑的问题(比如行开头有空格,或者是全角的2)。
内容的提问来源于stack exchange,提问作者arealhobo
相关产品推荐
相关产品推荐

