Python 按公共行将两个大文本文件合并为一个映射文件

Python 按公共行将两个大文本文件合并为一个映射文件,python,regex,unix,merge,bioinformatics,Python,Regex,Unix,Merge,Bioinformatics,我有两个格式相似的文本文件。第一个(732KB): 第二个(5.26GB): 注:关键区别在于每个条目的标题(lib_1749与Stool268_1)。我需要的是在一个文件的头和第二个文件的头之间创建一个映射文件,使用序列(例如,tacggaggatgcgagcgtatccggat…)作为键 注:作为最后一个复杂问题,映射不会是1对1,对于lib****的每个条目,将有多个Stool****表单条目。这是因为第一个文件中的密钥长度被修剪为200个字符,但第二个文件中的密钥长度可能更长 对于较小的

我有两个格式相似的文本文件。第一个(732KB):

第二个(5.26GB):

注:关键区别在于每个条目的标题(lib_1749与Stool268_1)。我需要的是在一个文件的头和第二个文件的头之间创建一个映射文件,使用序列(例如,
tacggaggatgcgagcgtatccggat…
)作为键

注:作为最后一个复杂问题,映射不会是1对1,对于lib****的每个条目,将有多个Stool****表单条目。这是因为第一个文件中的密钥长度被修剪为200个字符,但第二个文件中的密钥长度可能更长

对于较小的文件,我只需要在python中执行类似的操作,但我经常遇到问题,因为这些文件太大,无法一次性读入内存。通常我会尝试unix实用程序,但在这种情况下,我想不出如何实现这一点


谢谢大家!

在我看来,最简单的方法是使用BLAST+

将较大的文件设置为BLAST数据库,并使用较小的文件作为查询

然后,只需编写一个小脚本来分析输出,即点击一两下创建映射文件


顺便说一句,你可能会发现SequenceServer(Google it)在设置自定义Blast数据库和Blast环境方面很有帮助…

BioPython
应该能够读取大型FASTA文件

from Bio import SeqIO
from collections import defaultdict

mapping = defaultdict(list)

for stool_record in SeqIO.parse('stool.fasta', 'fasta'):
    stool_seq = str(stool_record.seq)

    for lib_record in SeqIO.parse('libs.fasta', 'fasta'):
        lib_seq = str(lib_record.seq)

        if stool_seq.startswith(lib_seq):
            mapping[lib_record.id.split(';')[0]].append(stool_record.id)

您可以用Python读取一个大文件,这可以通过MySQL或SQLite之类的工具来实现
>Stool268_1 HWI-ST155_0605:1:1101:1194:2070#CTGTCTCTCCTA
TACGGAGGATGCGAGCGTTATCCGGATTTACTGGGTTTAAAGGGAGCGCAGACGGGACGTTAAGTCAGCTGTGAAAGTTTGGGGCTCAACCCTAAAACTGCTAGCGGTGAAATGCTTAGATATCGGGAGGAACTCCGGTTGCGAAGGCAGCATACTGGACTGCAACTGACGCTGATGCTCGAAAGTGTGGGTATCAAACAGG
--
from Bio import SeqIO
from collections import defaultdict

mapping = defaultdict(list)

for stool_record in SeqIO.parse('stool.fasta', 'fasta'):
    stool_seq = str(stool_record.seq)

    for lib_record in SeqIO.parse('libs.fasta', 'fasta'):
        lib_seq = str(lib_record.seq)

        if stool_seq.startswith(lib_seq):
            mapping[lib_record.id.split(';')[0]].append(stool_record.id)