【问题标题】:Replacing text in one file with text from another file用另一个文件中的文本替换一个文件中的文本
【发布时间】:2018-03-29 12:43:09
【问题描述】:

我对一个文件(例如“file1.fasta”)中的标题进行排序,这些标题需要更改为另一个文件(例如“file2.fasta”)中的相应标题。注意: 1)即使 file1.fasta 有一些从 file2.fasta 反向补充的序列,我想保持序列不变。 2)file1.fasta序列来自不同的来源,这意味着标题显示各种格式;我只针对几种格式进行修改。

这是 file2.fasta 头文件的示例:

>OFAS009268-RA-EXON07 |design:coreoidea-v1,designer:forthman,probes-locus:OFAS009268-RA-EXON07,probes-probe:,probes-source:Clavigralla_tomentosicollis_gi_512427643_gb_GAJX01006991.1
CATTGCAGCAACTAACAGAGTTGATATATTAGATCCAGCCCTTCTCCGATCAGGCAGGCTAGACAGAAAAATTGAATTTCCTCATCCAAATGAAGATGCCCGTGCTCGAATTATGCAAAT
>OFAS016134-RA-EXON02 |design:coreoidea-v1,designer:forthman,probes-locus:OFAS016134-RA-EXON02,probes-probe:,probes-source:Anasa_tristis_comp3229_c0_seq1
AGGGCTTGTGATTCCCTTGAGCACATCGCAAGCCTCTGTTCTAGACAAAACATTCCACATTTGGTCAATAATGCTTTTGGTTTGCAAAGTGCACGTCTCATGCATTTAATTCAAGAGGCT

file1.fasta中各种不同的header格式示例(修改目标是前两个header):

>Clavigralla_tomentosicollis_gi_512427643_gb_GAJX01006991.1_103_rc
CATTGCAGCAACTAACAGAGTTGATATATTAGATCCAGCCCTTCTCCGATCAGGCAGGCTAGACAGAAAAATTGAATTTCCTCATCCAAATGAAGATGCCCGTGCTCGAATTATGCAAAT
>Anasa_tristis_comp3229_c0_seq1_0_rc
AGGGCTTGTGATTCCCTTGAGCACATCGCAAGCCTCTGTTCTAGACAAAACATTCCACATTTGGTCAATAATGCTTTTGGTTTGCAAAGTGCACGTCTCATGCATTTAATTCAAGAGGCT
>ENSOFAS009761_p2 |design:coreoidea-v1,designer:forthman,probes-locus:ENSOFAS009761,probes-probe:2,probes-source:Anoplocnemis_curvipes_contig5129
TTAAGAATCTCGAGAAAACCCCTCAGGATGATGAATTACTTGAAATATATGCTCTCTATAAACAAGCAACTGTAGGAGACTGTGACACAAGTAAGCCTGGGATGTTTGATTTCAAAGGGA1
>uce-3225_p7 |design:hemiptera-v1,designer:faircloth,probes-locus:uce-3225,probes-probe:7,probes-source:halhal1,probes-global-chromo:Scaffold629,probes-global-start:410155,probes-global-end:410275,probes-local-start:0,probes-local-end:120
AAATCCATCAAGAAATACCAACAACAACTTAAGGATGTCCAGACCGCACTCGAGGAAGAACAAAGAGCTAGGGATGATGCCCGAGAACAACTTGGTATTGCCGAAAGGCGAGCCAACGCT
>Anasa_tristis_comp8051_c0_seq1_A_0
ATCCTCCTGATTGGGCAGAAATTTTGAACCATTTTCGAGGGTCTGAACTTCAGAATTATTTTACAAAAATTTTGGAGGATGACCTTAAAGCCCTTATCAAGCCTCAGTATGTCGACCAAA
>Anasa_tristis_comp8051_c0_seq1_B_0
TAACGTCCTAGGTTAGGTTTCTGTTTACCAGCTAAAATCTTGAGGGCTGTAGACTTTCCAATGCCATTAGTTCCAACCAGACCTAAAACTTCTCCTGGTCTTGGAATTGGAAGTCTGTGG

最后两个与目标相似,但多了一个下划线和一个字母。这些需要保持不变。任何以>uce>ENSOFAS 开头的标头都应保留。新修改的 file1.fasta 文件应如下所示:

>OFAS009268-RA-EXON07 |design:coreoidea-v1,designer:forthman,probes-locus:OFAS009268-RA-EXON07,probes-probe:,probes-source:Clavigralla_tomentosicollis_gi_512427643_gb_GAJX01006991.1_OFAS009268-RA-EXON07
CATTGCAGCAACTAACAGAGTTGATATATTAGATCCAGCCCTTCTCCGATCAGGCAGGCTAGACAGAAAAATTGAATTTCCTCATCCAAATGAAGATGCCCGTGCTCGAATTATGCAAAT
>OFAS016134-RA-EXON02 |design:coreoidea-v1,designer:forthman,probes-locus:OFAS016134-RA-EXON02,probes-probe:,probes-source:Anasa_tristis_comp3229_c0_seq1_OFAS016134-RA-EXON02
AGGGCTTGTGATTCCCTTGAGCACATCGCAAGCCTCTGTTCTAGACAAAACATTCCACATTTGGTCAATAATGCTTTTGGTTTGCAAAGTGCACGTCTCATGCATTTAATTCAAGAGGCT
>ENSOFAS009761_p2 |design:coreoidea-v1,designer:forthman,probes-locus:ENSOFAS009761,probes-probe:2,probes-source:Anoplocnemis_curvipes_contig5129
TTAAGAATCTCGAGAAAACCCCTCAGGATGATGAATTACTTGAAATATATGCTCTCTATAAACAAGCAACTGTAGGAGACTGTGACACAAGTAAGCCTGGGATGTTTGATTTCAAAGGGA1
>uce-3225_p7 |design:hemiptera-v1,designer:faircloth,probes-locus:uce-3225,probes-probe:7,probes-source:halhal1,probes-global-chromo:Scaffold629,probes-global-start:410155,probes-global-end:410275,probes-local-start:0,probes-local-end:120
AAATCCATCAAGAAATACCAACAACAACTTAAGGATGTCCAGACCGCACTCGAGGAAGAACAAAGAGCTAGGGATGATGCCCGAGAACAACTTGGTATTGCCGAAAGGCGAGCCAACGCT
>Anasa_tristis_comp8051_c0_seq1_A_0
ATCCTCCTGATTGGGCAGAAATTTTGAACCATTTTCGAGGGTCTGAACTTCAGAATTATTTTACAAAAATTTTGGAGGATGACCTTAAAGCCCTTATCAAGCCTCAGTATGTCGACCAAA
>Anasa_tristis_comp8051_c0_seq1_B_0
TAACGTCCTAGGTTAGGTTTCTGTTTACCAGCTAAAATCTTGAGGGCTGTAGACTTTCCAATGCCATTAGTTCCAACCAGACCTAAAACTTCTCCTGGTCTTGGAATTGGAAGTCTGTGG

我有一个 python 脚本,有人提供了我用于类似情况的 Python 脚本(但用于不同格式的标题)。我不熟悉 python 语言,并且很好奇是否有办法修改这个脚本来实现这个新目的。

#!/usr/bin/env python

import sys
import re

original_fn = sys.argv[1]
company_fn = sys.argv[2]

pattern = '(uce | ENSOFAS | _[AB]_[0-9]+$)'

map = {}

with open(original_fn, "r") as original_fh:
    for line in original_fh:
        if line.startswith('>'):
            try:
                 (k, v) = line.strip().split('|')
                 # remove trailing space from key
                 k = k[:-1]
                 map[k] = v
            except ValueError as err:
                 k = line.strip()
                 map[k] = None

with open(company_fn, "r") as company_fh:
    for line in company_fh:
        if line.startswith('>') and not re.search(pattern, line.strip()):
            try:
                (k, v) = line.strip().split('|')
                # remove trailing character from key
                k = k[:-1]
            except ValueError as err:
                k = line.strip()
            if k not in map:
                sys.stdout.write("%s\n" % (k))
            else:
                sys.stdout.write("%s |%s\n" % (k, map[k]))
        else:
            sys.stdout.write("%s" % (line))

【问题讨论】:

  • 请提供输入文件的示例以及该输入文件的输出。目前,根据您提供的内容,虽然非常详细,但实际上很难看出您在使用什么。
  • 我看不到如何附加示例文件,但帖子中有这些示例。
  • 你是说 > 继续标题并且遗传密码包含在同一个文件中。我认为它不是很清楚,因此为什么到目前为止没有人回答你。我确实认为这是正则表达式问题的一个很好的例子。
  • 什么是 argv[1] 和 argv[2] 输入?这些是file1.fasta 和file2.fasta 吗?这是我困惑的一部分。
  • > 是与给定序列相关联的标题/描述的开始。是的,DNA 序列包含在文件中,所有这些都位于给定标题/描述之后的下一行。我认为需要一些正则表达式解决方案,它基本上针对至少带有> 符号的标题行。 argv[1] 和 argv[2] 对应 file2.fasta 和 file1.fasta 文件。要执行名为 reprocess.py 的脚本,我会输入,例如,./reprocess.py file2.fasta file1.fasta > reprocessed_file1.fasta

标签: python search replace


【解决方案1】:

如果我现在明白你需要什么,那就是:

#!/usr/bin/env python

import sys

original_fn = sys.argv[1]
company_fn = sys.argv[2]

fpOriginal  =  open(original_fn, "r")

for lineCompany in open(company_fn, "r").readlines():
  if lineCompany.startswith('*'):
    sys.stdout.write( fpOriginal.readline() )
    fpOriginal.readline()
  else:
    sys.stdout.write( lineCompany )

fpOriginal.close()

【讨论】:

  • 这很接近。它只是按顺序从 sys.argv[1] 文件中提取标题,然后按顺序用这些替换 *> 行。文件之间的顺序不匹配。此外,作为背景,sys.argv[2] 序列在 sys.argv[1] 文件中被“切割”成更小的序列以进行探针设计。因此,每个 sys.argv[2] 标头都应替换至少两个相应的 sys.argv[1] 标头。我希望这是有道理的。
  • 好的,所以顺序不匹配但两个文件中的遗传密码相同?如果是这样,我建议您一次阅读两行。将第二行作为字典的键,将第一行作为值。然后,当您获得替换匹配时,您只需将 file1.fasta 读取为值、键、值、键等,并将任何以 * 开头的值替换为 file2.fasta 字典中的值。它干净且易于遵循。
  • file1.fasta 有一些与 file2.fasta 反向互补的序列,因此它们并不完全相同。但是,我应该已经有一个脚本,它可以采用具有原始序列的 file2.fasta,并在 file3.fasta 输出中对所有这些序列进行反向补码。然后我可以catfile2.fasta 和file3.fasta,所以它对于每个标题都有两个序列链版本,然后可以用来匹配file1.fasta。但是,我仍然不知道如何修改您的脚本来执行此操作。不幸的是,我没有使用 python 或其他编码语言的经验。
猜你喜欢
  • 2019-03-06
  • 2015-02-25
  • 2021-09-18
  • 2013-05-19
  • 2018-12-27
  • 2020-01-09
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
相关资源
最近更新 更多