如何用Python按数字条件过滤修改文本文件中的状态字符串
问题
我有一个类矩阵结构的文本文件,包含字符串与数字,示例内容如下:
300 "FTPAT1 2 " 301 "CHURCH 2 " "01" "Open" "Line" 300 "CHURCH 2 " 301 "GREENL1 1 " "01" "Open" "Line" 400 "FTPAT1 2 " 401 "CHURCH 2 " "01" "Closed" "Line" 400 "CHURCH 2 " 401 "GREENL1 1 " "01" "Closed" "Line"
我希望设置过滤规则:将以300-301开头行的"Open"改为"Closed",以400-401开头行的"Closed"改为"Open"。目前我仅实现了读取文件的代码:
file = open('testfile.txt', 'r'): for line in file: print line,
请帮忙提供完整的实现方案,非常感谢!
回答
没问题,我来帮你搞定这个文本处理需求。先修正你原有代码里的小语法问题,再添加对应的替换逻辑,下面是完整的实现方案:
核心思路
- 安全解析内容:因为文件里有带空格的引号字符串,不能直接用普通
split()拆分,得用能识别引号的工具保证内容不被拆坏 - 匹配行标识:判断每行是否是
300 301或400 401开头 - 按规则替换:找到对应的
Open/Closed进行状态翻转 - 还原格式写入:确保输出的格式和原文件一致,不破坏原有结构
完整代码
import shlex # 用with语句自动管理文件,不用手动关闭,更安全可靠 with open('testfile.txt', 'r') as input_file, open('processed_testfile.txt', 'w') as output_file: for line in input_file: # 先去掉行尾的换行符,再解析带引号的内容 cleaned_line = line.strip() # shlex.split会把带引号的含空格字符串当成一个整体,比如"FTPAT1 2 "不会被拆成两部分 line_parts = shlex.split(cleaned_line) # 判断当前行的开头标识 if len(line_parts) >= 2 and line_parts[0] == '300' and line_parts[1] == '301': # 遍历找到"Open"并替换为"Closed" for idx, part in enumerate(line_parts): if part == 'Open': line_parts[idx] = 'Closed' elif len(line_parts) >= 2 and line_parts[0] == '400' and line_parts[1] == '401': # 遍历找到"Closed"并替换为"Open" for idx, part in enumerate(line_parts): if part == 'Closed': line_parts[idx] = 'Open' # 把处理后的内容重新拼接成符合原格式的行 # 对包含空格的部分重新加上引号,保证格式和原文件一致 processed_line = ' '.join( f'"{part}"' if ' ' in part else part for part in line_parts ) + '\n' # 写入到输出文件 output_file.write(processed_line) print("处理完成!结果已保存到processed_testfile.txt")
代码细节说明
shlex.split():这个方法是处理你文件格式的关键,它能正确识别引号包裹的含空格字符串,避免内容被错误拆分with语句:自动处理文件的打开和关闭,不用担心忘记关闭文件导致的资源泄漏问题- 格式还原:拼接时判断每个内容块是否包含空格,有空格的就重新加上引号,保证输出和原文件的格式完全一致
- 输出到新文件:默认将结果写入新文件,不会修改原文件,方便你对比处理前后的差异;如果需要直接覆盖原文件,记得先备份,再把输出文件名改成原文件名即可
内容的提问来源于stack exchange,提问作者bingqian hu
相关产品推荐
相关产品推荐

