从第7列开始两两合并ATGC列,求高效Python实现方案
高效处理大列数文本文件的Python实现
针对你处理432行、超120万列文本文件的需求,以下是内存友好且速度更优的Python实现方案,核心思路是逐行处理避免加载整个大文件到内存,同时利用Python高效的字符串和列表操作替代awk的列处理逻辑:
基础实现版本
适合直接指定文件路径的场景,代码简洁易读:
input_path = "input.txt" output_path = "output.txt" with open(input_path, 'r') as infile, open(output_path, 'w') as outfile: for line in infile: # 分割行到列列表,自动处理任意数量的空格分隔 columns = line.strip().split() # 保留前6列不变 result = columns[:6] # 从第7列(索引6)开始,每两列合并 for idx in range(6, len(columns), 2): # 处理列数为奇数的边界情况:若最后剩单列则直接保留 if idx + 1 < len(columns): result.append(columns[idx] + columns[idx+1]) else: result.append(columns[idx]) # 拼接成行并写入输出文件 outfile.write(' '.join(result) + '\n')
性能优化版本
利用sys模块的标准IO流进一步提升速度,适合通过管道调用的场景(处理超大文件时速度更优):
import sys def process_single_line(line): columns = line.strip().split() result = columns[:6] # 步长为2遍历,提前判断避免越界 for idx in range(6, len(columns)-1, 2): result.append(columns[idx] + columns[idx+1]) # 检查是否存在未配对的最后一列 if len(columns) > 6 and len(columns) % 2 != 0: result.append(columns[-1]) return ' '.join(result) + '\n' def main(): # 逐行读取标准输入,处理后写入标准输出 for line in sys.stdin: sys.stdout.write(process_single_line(line)) if __name__ == "__main__": main()
使用方式
将上述代码保存为merge_bases.py,然后在终端执行:
python merge_bases.py < input.txt > output.txt
为什么比awk更快?
- 对于超120万列的极端场景,awk的列解析逻辑会因为列数过多产生额外开销,而Python的列表分割和拼接是底层优化的操作,处理效率更高;
- 逐行处理的逻辑保证内存占用始终维持在单行列数据的大小,不会出现内存溢出问题;
sys版本的IO操作跳过了Python内置open的额外封装,直接对接系统IO流,进一步降低IO延迟。
内容的提问来源于stack exchange,提问作者shanwa
相关产品推荐
相关产品推荐

