Python脚本修改需求:替换Solution行内容为Major字段值
问题
现有一段Python脚本,功能是把输入文件中以#Solution 1开头的行和输入文件名一同写入新文件,但现在需要把该行内容替换为对应输入文件中Major列的内容,请求修改脚本实现该需求。
现有脚本
#!/usr/bin/env python3 import os dr = "/home/nwalraven/Result_pgx/Runfolder/Runres_Aldy" outdr = "/home/nwalraven/Result_pgx/Runfolder/Aldy_res_txt" tag = ".aldy" for f in os.listdir(dr): if f.endswith(tag): print(f) new_file_name = f.split('_')[0]+'.txt' # get the name of the file before the '_' and add '.txt' to it with open(dr+"/"+f) as file: for line in file.readlines(): f if line.startswith("#Solution 1"): with open(outdr+"/"+new_file_name,"a",newline='\n') as new_file: new_file.write(f.split('.')[0] + "\n") new_file.write(line + "\n") if line.startswith("#Solution 2"): with open(outdr+"/"+new_file_name,"a",newline='\n') as new_file: new_file.write(line + "\n") print("Meerdere oplossingen gevonden! Check Aldy bestand" )
输入文件示例
文件:EMQN3-S3_COMT.aldy
#Sample Gene SolutionID Major Minor Copy Allele Location Type Coverage Effect dbSNP Code Status #Solution 1: *Met, *ValB EMQN3-S3 COMT 1 *Met/*ValB Met;ValB 0 Met 19950234 C>T 530 H62= rs4633 EMQN3-S3 COMT 1 *Met/*ValB Met;ValB 0 Met 19951270 G>A 651 V158M rs4680 EMQN3-S3 COMT 1 *Met/*ValB Met;ValB 1 ValB
文件:EMQN3-S3_CYP2B6.aldy
#Sample Gene SolutionID Major Minor Copy Allele Location Type Coverage Effect dbSNP Code Status #Solution 1: *1.001, *1.001 EMQN3-S3 CYP2B6 1 *1/*1 1.001;1.001 0 1.001 EMQN3-S3 CYP2B6 1 *1/*1 1.001;1.001 1 1.001
当前输出
EMQN3-S3_COMT.aldy #Solution 1: *Met, *ValB EMQN3-S3_CYP2B6.aldy #Solution 1: *1.001, *1.001
期望输出
EMQN3-S3_COMT.aldy #Solution 1: *Met/*ValB EMQN3-S3_CYP2B6.aldy #Solution 1: *1/*1
解决方案
修改后的脚本如下,核心逻辑是提取文件中Major列的值,替换原#Solution 1行的内容:
#!/usr/bin/env python3 import os dr = "/home/nwalraven/Result_pgx/Runfolder/Runres_Aldy" outdr = "/home/nwalraven/Result_pgx/Runfolder/Aldy_res_txt" tag = ".aldy" # 确保输出目录存在,避免路径不存在报错 os.makedirs(outdr, exist_ok=True) for f in os.listdir(dr): if f.endswith(tag): print(f) new_file_name = f.split('_')[0] + '.txt' file_path = os.path.join(dr, f) new_file_path = os.path.join(outdr, new_file_name) solution1_found = False major_value = None with open(file_path, 'r') as file: for line in file: line = line.strip() if not line: continue # 跳过空行 if line.startswith("#Solution 1"): solution1_found = True elif line.startswith("#"): continue # 跳过其他注释行(如表头) else: # 按制表符分割数据行,提取Major列(对应表头第4列,索引为3) parts = line.split('\t') if len(parts) >= 4 and not major_value: major_value = parts[3] # 获取到Major值后,写入文件名和替换后的Solution 1行 with open(new_file_path, "a", newline='\n') as new_file: new_file.write(f.split('.')[0] + "\n") new_file.write(f"#Solution 1: {major_value}\n\n") # 容错处理:找到Solution 1但未提取到Major值的情况 if solution1_found and not major_value: with open(new_file_path, "a", newline='\n') as new_file: new_file.write(f.split('.')[0] + "\n") new_file.write("#Solution 1: 未找到Major列数据\n\n") # 保留原Solution 2的处理逻辑 with open(file_path, 'r') as file: for line in file: if line.startswith("#Solution 2"): with open(new_file_path, "a", newline='\n') as new_file: new_file.write(line) print("发现多个解决方案!请检查Aldy文件")
关键改动说明
- 路径优化:使用
os.path.join拼接文件路径,避免手动拼接时的分隔符问题,代码更健壮。 - Major值提取:遍历文件时跳过注释行,在数据行中提取
Major列内容(对应表头第4列,索引为3)。 - 写入逻辑调整:找到
#Solution 1标记后,等待获取到Major值再写入替换后的行,确保内容准确。 - 容错处理:增加未找到Major值的分支,避免遗漏内容写入。
- 目录保障:添加
os.makedirs确保输出目录存在,防止运行时报错。
内容的提问来源于stack exchange,提问作者lost_newbie
相关产品推荐
相关产品推荐

