You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件")

关键改动说明

  1. 路径优化:使用os.path.join拼接文件路径,避免手动拼接时的分隔符问题,代码更健壮。
  2. Major值提取:遍历文件时跳过注释行,在数据行中提取Major列内容(对应表头第4列,索引为3)。
  3. 写入逻辑调整:找到#Solution 1标记后,等待获取到Major值再写入替换后的行,确保内容准确。
  4. 容错处理:增加未找到Major值的分支,避免遗漏内容写入。
  5. 目录保障:添加os.makedirs确保输出目录存在,防止运行时报错。

内容的提问来源于stack exchange,提问作者lost_newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:06:00