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替换为“,”,但无济于事。
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')
创建两个字典很容易,然后映射两个字典值。
由于文件是如此整齐地组织,所以我不会使用集合来存储行。集合不强制执行顺序,这些行的顺序传达了很多信息。我也不会使用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和值都带有尾随换行符。您可以删除它们,但是由于要重新添加它们以编写输出文件,因此最简单的方法是不理它们。