使用文件搜索另一个文件并打印与第一个文件匹配的模式的行

问题描述 投票:0回答:2

Python noob在这里。我一直在努力尝试执行此操作,尝试了几种Unix工具,并且我坚信python是必经之路。

我有两个文件,File1具有这样的标题和数字:

>id1
77
>id2
2
>id3
2
>id4
22
...

请注意,身份证号码是唯一的,但分配给它的号码可能会重复。我有几个这样的文件,它们的标头数相同(〜500)。

文件2具有文件1的所有编号和附加序列

1
ATCGTCATA
2
ATCGTCGTA
...
22
CCCGTCGTA
...
77
ATCGTCATA
...

注意,序列号是唯一的,因为其后的所有序列都是唯一的。我的文件数量与File1相同,但是每个File2中的序列数可能会有所不同(〜150)。

我想要的输出是File1,它具有File2的顺序,重要的是File1保持原始顺序。

>id1
ATCGTCATA
>id2
ATCGTCGTA
>id3
ATCGTCGTA
>id4
CCCGTCGTA

我的方法是从File1中提取数字,并将其用作在File2中进行匹配的模式。首先,我试图仅使用一对文件来完成这项工作。这是我取得的成就:

#!/usr/bin/env python

import re

datafile = 'protein2683.fasta.txt.named'
schemaseqs = 'protein2683.fasta'

with open(datafile, 'r') as f:
    datafile_lines = set([line.strip() for line in f]) #maybe I could use regex to get only lines with number as pattern?
    print (datafile_lines)

outputlist = []

with open(schemaseqs, 'r') as f:
    for line in f:
        seqs = line.split(',')[0]
        if seqs[1:-1] in datafile_lines:
            outputlist.append(line)

    print (outputlist)

这将输出File1中的模式和File2中的序列的混合。任何帮助表示赞赏。

Ps:我愿意修改文件结构,我尝试在File2中将\ n替换为“,”,但无济于事。

python search
2个回答
0
投票
import re

datafile = 'protein2683.fasta.txt.named'
schemaseqs = 'protein2683.fasta'
datafile_lines = []
d = {}
prev = None
with open(datafile, 'r') as f:
    i = 0
    for line in f:
        if i % 2 == 0:
            d[line.strip()]=0
            prev = line.strip()
        else:
            d[prev] = line.strip()
        i+=1

new_d = {}
with open(schemaseqs, 'r') as f:
    i=0
    prev = None
    for line in f:
        if i % 2 == 0:
            new_d[line.strip()]=0
            prev = line.strip()
        else:
            new_d[prev] = line.strip()
        i+=1

for key, value in d.items():
    if value in new_d:
        d[key] = new_d[value]

print(d)

with open(datafile,'w') as filee:
    for k,v in d.items():
        filee.writelines(k)
        filee.writelines('\n')
        filee.writelines(v)
        filee.writelines('\n')

创建两个字典很容易,然后映射两个字典值。


0
投票

由于文件是如此整齐地组织,所​​以我不会使用集合来存储行。集合不强制执行顺序,这些行的顺序传达了很多信息。我也不会使用Regex;对于解析单个行而言,这可能是过大的了,但功能不足以跟踪哪个ID与每个基因序列相对应。

相反,我将以相反的顺序读取文件。首先,读取具有基因序列的文件,并建立ID与基因的映射。然后读入第一个文件,并用该映射中的相应值替换每个id。

如果ID是连续序列(1、2、3 ... n,n + 1),则列表可能是存储它们的最简单方法。如果文件已经整理好,您甚至不必注意ID号;您可以跳过每隔一行,并将每个基因序列依次添加到数组中。如果它们不是连续的,则可以使用ID为键的字典。在本示例中,我将使用字典方法:

id_to_gene_map = {}

with open(file2, 'r') as id_to_gene_file:
    for line_number, line in enumerate(id_to_gene_file, start=1):
        if line_number % 2 == 1:  # Update ID on odd numbered lines, including line 1
            current_id = line
        else:
            id_to_gene_map[current_id] = line  # Map previous line's ID to this line's value

with open(file1, 'r') as input_file, open('output.txt', 'w') as output_file:
    for line in input_file:
        if not line.startswith(">"):  # Keep ">id1" lines unchanged
            line = id_to_gene_map[line]  # Otherwise, replace with the corresponding gene
        output_file.write(line)    

在这种情况下,ID和值都带有尾随换行符。您可以删除它们,但是由于要重新添加它们以编写输出文件,因此最简单的方法是不理它们。

© www.soinside.com 2019 - 2024. All rights reserved.