การรวมลำดับ DNA จากสองไฟล์ภายใต้ชื่อสปีชีส์เดียวกัน

ฉันมีไฟล์ FASTA สองไฟล์ที่มีลำดับ DNA ที่เข้ารหัสสำหรับโปรตีนสองชนิดที่แตกต่างกัน ฉันต้องการรวมลำดับของโปรตีนต่างๆ และสปีชีส์เดียวกันเข้าด้วยกันเป็นลำดับยาวๆ ลำดับเดียว

ตัวอย่างเช่น ฉันมี:

Protein 1
>sce
AGTAGATGACAGCT
>act
GCTAGCTAGCT
Protein 2
>sce
GCTACGATCGACT
>act
TACGATCAGCTA
Protein 1+2
>sce
AGTAGATGACAGCTGCTACGATCGACT
>act
GCTAGCTAGCTTACGATCAGCTA

สิ่งที่อาจเป็นปัญหาเล็กน้อยก็คือสปีชีส์ไม่ปรากฏในลำดับเดียวกันในทั้งสองไฟล์และมีลำดับบางอย่างที่พบในไฟล์เดียว แต่ไม่ใช่ในอีกไฟล์หนึ่ง (ไฟล์มีความยาวประมาณ 110 สปีชีส์ โดยมี ความคลาดเคลื่อนของ 4 หรือ 5)

ความพยายามครั้งแรกของฉันในการเขียนโค้ดคือ:

gamma = open('gamma.fas', 'w')
spc = open("spc98.fas", 'w')
outfile = open("joined.fas", 'w')
for line in gamma:
    if line.startswith(">"):
        for line2 in spc:
             if line2.startswith(">"):
                if line == line2:
                    outfile.write(line)
    else:
        outfile.write(line)
fh.close()

แต่เนื่องจากลำดับ DNA นั้นยาวมากและกินพื้นที่หลายบรรทัด ฉันจึงไม่รู้ว่าจะเลือกมันอย่างไร

กรุณาช่วย!


person Ana Catarina Vitorino    schedule 14.08.2019    source แหล่งที่มา


คำตอบ (2)


เมื่อใช้พจนานุกรม คุณสามารถผนวกลำดับ fasta เข้ากับแต่ละ ID ได้ จากนั้นพิมพ์ลงในไฟล์เอาท์พุต

outfile = open("joined.fas", 'w')

d = dict()

for file in ('gamma.fas', 'spc98.fas'):
    with open(file, 'r') as f:
        for line in f:
            line = line.rstrip()
            if line.startswith('>'):
                key = line
            else:
                d.setdefault(key, '')
                d[key] += line

for key, seq in d.items():
    outfile.write(key + "\n" + seq + "\n")

outfile.close()

แก้ไข: อย่างไรก็ตาม คุณกำลังเปิดไฟล์การอ่านสองไฟล์ของคุณโดยเปิดให้เขียนซึ่งจะปิดกั้นไฟล์อินพุตทั้งสองไฟล์

gamma = open('gamma.fas', 'w') spc = open("spc98.fas", 'w')

ควรเปิดด้วย r แทนที่จะเป็น w

person Chris Charley    schedule 14.08.2019

เนื่องจากคุณติดแท็ก Biopython นี่เป็นโซลูชันขนาดกะทัดรัด โปรดทราบว่ามันจะทำให้ไฟล์ทั้งหมดอยู่ในหน่วยความจำ (ตามวิธีที่ง่ายที่สุด):

from Bio.Seq import Seq
from Bio import SeqIO

d = SeqIO.to_dict(SeqIO.parse('1.fasta', 'fasta'))

for r in SeqIO.parse('2.fasta', 'fasta'):
    d[r.id] = d.setdefault(r.id, Seq('')) + r.seq

SeqIO.write(d.values(), 'output.fasta', 'fasta')

ที่นี่ 1.fasta และ 2.fasta คือไฟล์ fasta อินพุตสองไฟล์ของคุณ และ output.fasta คือไฟล์เอาต์พุตที่รวมเข้าด้วยกัน

นอกจากนี้ โปรดทราบว่าในทางชีววิทยา ฉันคิดว่านี่เป็นสิ่งที่แปลกที่ต้องทำ การต่อลำดับระหว่างไฟล์หลาย ๆ ไฟล์อาจนำไปสู่การสร้างลำดับที่ต่อเนื่องกัน 'ปลอม' และลำดับของการต่อข้อมูลเป็นสิ่งสำคัญอย่างแน่นอน ดังนั้นควรระวัง

person Chris_Rands    schedule 15.08.2019