Python批量修改文本文件中指定行特定字段的末尾7位字符
问题场景
我有数千个文本文件,每个文件结构类似示例:
Type Basemap 20221118202211
QSNGAGL1 20221120209912300111111 1B Bus O
QO1290BOB203871145 T1
QI1290BOA0587611451145B T1
QI1290BOB2044911451145B T1
QI1200BOB2014411451145B T1
QI1200BOB2014611451145B T1
QT1200DOY385621145 T1
QSNGAGL2 20221120209912300100110 1B Bus O
QO1290BOB203871145 T1
QI1290BOA0587611451145B T1
QI1200DOY2932411451145B T1
QI1200DOA2517511451145B T1
QT1200DOY385621145 T1
QSNFB 1 20221009209912300101100 1 Bus O
QO1290BOB203871115 T1
QI1290BOA0587611151115B T1
QI1290BOB2044911151115B T1
#(and so on... for ~60,000 rows per file...)
文件特点:
- 首行为唯一表头
- 数据行间距不固定
- 以
QS开头的行之间的非QS行数量不固定 - 部分文件55000行后存在文本溢出到行右侧的情况
需求:
- 遍历所有目标文件
- 找出所有以
QS开头的行 - 定位该行第二个字段(以2022开头的数字串,末尾7位是1/0组合)
- 将该字段最后7位替换为
1111100 - 保存为前缀
fixed_的新文件,不覆盖原文件
此前尝试用pandas无法正确读取数据,简单查找替换也不可行(末尾7位组合不固定)。
解决方案
用Python编写脚本逐行处理文本,避免解析错误:
import os import re # 替换为你的目标文件夹路径 target_dir = "./your_files_directory" # 固定替换的后缀字符串 replace_suffix = "1111100" def process_single_file(file_path): # 生成带fixed_前缀的新文件路径 file_name = os.path.basename(file_path) new_file_path = os.path.join(os.path.dirname(file_path), f"fixed_{file_name}") with open(file_path, 'r', encoding='utf-8') as infile, open(new_file_path, 'w', encoding='utf-8') as outfile: for line in infile: # 处理以QS开头的行 if line.strip().startswith('QS'): # 正则匹配:QS开头的内容 + 第二个数字字段 + 后续内容 def replace_target_field(match): original_num = match.group(2) # 替换最后7位,确保字段长度足够 if len(original_num) >= 7: new_num = original_num[:-7] + replace_suffix else: new_num = original_num return f"{match.group(1)}{new_num}{match.group(3)}" line = re.sub(r'(QS\S+\s+)(\d+)(\s+.+)', replace_target_field, line) # 写入处理后的行 outfile.write(line) # 遍历目标文件夹下所有文件 for root, _, files in os.walk(target_dir): for file in files: # 可添加过滤条件,比如只处理.txt文件:if file.endswith('.txt') full_path = os.path.join(root, file) process_single_file(full_path) print(f"处理完成:{full_path} -> fixed_{file}")
脚本说明
- 逐行处理模式,避免大文件占用过多内存
- 用正则精准匹配目标字段,保留原行的空格格式,适配间距不一致的问题
- 自动遍历文件夹下所有文件,生成新文件时不会覆盖原文件
- 兼容行尾文本溢出的情况,不受行长度限制
使用注意
- 替换
target_dir为你的实际文件路径 - 若只需处理特定后缀文件,取消注释并修改
if file.endswith('.txt')的后缀条件 - 先测试少量文件,确认结果符合预期后再批量处理
内容的提问来源于stack exchange,提问作者Theo F

