大文件中Python字符串格式化:拆分公共/非公共部分并重组输出
实现思路与解决方案
咱们先把需求拆解清楚,方便后续落地:
- 每行的前8个空格分隔字段是公共前缀,需要重复拼接在每个目标片段的前面
- 从每行剩余内容里,提取所有
C S<->和P C<->格式的片段 - 最终把「公共前缀 + 目标片段」的组合全部拼接成一行输出
针对你这个5万条记录的大文件,推荐两种高效的实现方案,分别适配不同场景:
方案一:Python(跨平台、易扩展)
Python的逐行读取特性可以避免一次性加载整个大文件导致内存溢出,步骤清晰易懂:
- 用
with open同时打开输入和输出文件,逐行处理每条记录 - 把每行按空格拆成字段列表,取前8个字段拼接成公共前缀
common_prefix - 用正则表达式匹配剩余内容里所有
C S<->或P C<->的片段 - 给每个匹配到的片段前面加上公共前缀,把所有组合拼接成一行写入输出文件
完整代码如下:
import re # 定义匹配目标片段的正则规则 target_pattern = re.compile(r'(C S<->|P C<->)') with open('your_input_file.txt', 'r') as infile, open('your_output_file.txt', 'w') as outfile: for line in infile: line = line.strip() if not line: continue fields = line.split() # 跳过字段数不足的异常行 if len(fields) < 8: continue # 生成公共前缀 common_prefix = ' '.join(fields[:8]) # 提取剩余内容 rest_content = ' '.join(fields[8:]) # 找到所有符合要求的目标片段 matches = target_pattern.findall(rest_content) # 拼接输出内容 output_segments = [f"{common_prefix} {match}" for match in matches] output_line = ' '.join(output_segments) outfile.write(output_line + '\n')
方案二:Awk(Linux/Unix环境下效率拉满)
Awk是专门处理文本的工具,处理大文件的速度比Python快很多,适合服务器端场景:
- 直接提取每行的前8个字段作为公共前缀
- 从第9个字段开始遍历,检查当前字段和下一个字段是否组成目标片段
- 每找到一个目标片段,就把「公共前缀 + 片段」追加到输出字符串里
- 处理完一行后,打印最终的输出内容
完整命令如下:
awk '{ # 拼接公共前缀 prefix = $1 " " $2 " " $3 " " $4 " " $5 " " $6 " " $7 " " $8 output = "" # 遍历剩余字段寻找目标片段 for (i=9; i<=NF; i++) { if (($i == "C" && $(i+1) == "S<->") || ($i == "P" && $(i+1) == "C<->")) { if (output != "") output = output " " output = output prefix " " $i " " $(i+1) i++ # 跳过已处理的下一个字段 } } print output }' your_input_file.txt > your_output_file.txt
这两个方案都能高效处理你的大文件,根据你的运行环境选择即可~
内容的提问来源于stack exchange,提问作者user3698773
相关产品推荐
相关产品推荐

