30/09/2018, 17:44

Hỏi về cách xử lí một file văn bản có định dạng sẵn trong python

Mình đang học Bioinformatics, và có một bài toán này, thực ra thuật toán thì không phức tạp lắm, nhưng mình lại bị vướng ở khúc xử lí file dữ lieu input. Bài toán như sau:

Cho một file .txt trong đó chứa dữ liệu chuỗi DNA của khoảng 10 người, với định dạng kiểu FASTA, với mở đầu cho một chuỗi DNA sẽ là 1 nhãn chứa ID của bệnh nhân, ví dụ:

>Rosalind_6404
CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC
TCCCACTAATAATTCTGAGG
>Rosalind_5959
CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT
ATATCCATTTGTCAGCAGACACGC
>Rosalind_0808
CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGAC
TGGGAACCTGCGGGCAGTAGGTGGAAT

Tính tỉ lệ % số nucleotit G và C trong mỗi chuỗi DNA của từng bệnh nhân, sau đó trả về mã bệnh nhân có tỉ lệ nucleotit GC cao nhất trong số những bệnh nhân trong này cùng với tỉ lệ %GC của họ.
Trong ví dụ trên, output sẽ là

 >Rosalind_0808
 60.919540

Tức là bệnh nhân mã 0808 có tỉ lệ GC trong gen cao nhất, và tỉ lệ đó là 60.919540%
Cái mình vướng ở đây là, kiểu file này ở mỗi chuỗi nucleotit sau một số nhất định kí tự nó sẽ xuống dòng để viết tiếp chứ không phải 1 chuỗi viết trong 1 dòng. Mình thử gán theo kiểu dictionary, với mỗi mã bệnh nhân sẽ chứa chuỗi nucleotit của bệnh nhân đó để xử lí. Code của mình để xử lý file là:

f=open('input.txt','r')     #file input.txt chứa dữ liệu đầu vào
s={}
a=f.readlines()
i=0
while i<=len(a)-1:
	if a[i][0]=='>':           #Nhận biết dòng chứa mã bệnh nhân, bắt đầu cho một profile mới, dòng này bắt đầu bằng ký tự ">"
		ident=a[i]
		s[ident]='
		i=i+1
		data=a[i]
		while data[0]!='>':
			s[ident]=s[ident]+data[0:len(dat)-1]  # cộng them chuoi ở dòng tiếp theo vào chuoi đang có trong id "ident" trong dictionary s[ident], bỏ qua dấu xuống dòng 
 trong file input
			i=i+1
			data=a[i]

Mình chạy thử code, và nó báo lỗi :

Traceback <most recent call last>:
    File "Testdic.py", line 14, in <module>
        dat=a[i]
Index Error: list index out of range

Nếu mình chạy thuật toán bằng tay thì nó có lý, mà chạy chương trình thì nó ra vậy :(( Bạn nào tìm lỗi sai giúp mình với :((

Gió viết 19:48 ngày 30/09/2018
while data[0]!='&gt;':

i= +oo

Nguyễn Trí Dân viết 19:56 ngày 30/09/2018

Em không hiểu lắm, sửa lại như thế nào anh ?

htl@PyMI.vn viết 19:55 ngày 30/09/2018

Nghĩa là vòng lặp đó của bạn là lặp vô hạn, không có điều kiện để nó thoát ra khỏi vòng lặp đó. Nó sẽ dừng ở dòng đầu tiên có ký tự đầu khác “>” và lặp ở đó vô hạn.

Nguyễn Trí Dân viết 19:51 ngày 30/09/2018

sau mỗi lần thử mình đều tang giá trị i lên 1 đơn vị mà (i=i+1) và nó sẽ thoát lặp khi gặp được một dòng khác bắt đầu bằng dấu “>” và trở lại từ dòng while i<=len(a)-1 mà với cả mình cũng giới hạn i nó chỉ nhỏ hơn hoặc bằng độ dài của chuỗi a thôi, nên mình không nghĩ là nó lặp vô hạn

htl@PyMI.vn viết 19:50 ngày 30/09/2018

Vấn đề là khi bạn nhảy vào trong vòng while thì sẽ không có điều kiện nào để bạn nhảy ra

Mình viết 1 đoạn mã như này để tạo 1 list

file = open('dna.txt', 'r')

data = []

# create a list with names and data like: ['>Rosalind_xxx', 'CCTG...', '>Rosalind_xxx', 'CCTG...', ... ]
for line in file.readlines():
    if line[0] == '>':
        data.append(line.strip('\n'))
        data.append('')
    else:
        data[-1] += line.strip('\n')
print(data)

Bạn chạy thử rồi xem có vận dụng được không nhé

Nguyễn Trí Dân viết 19:56 ngày 30/09/2018

không bị lỗi bạn à :)) cám ơn bạn nhiều lắm :))
chắc mình vẫn phải coi lại tại sao cái của mình thì nó lại bị báo lỗi khi lặp nhỉ

htl@PyMI.vn viết 19:50 ngày 30/09/2018

i = i + 1 nhưng i không liên quan đến điều kiện dừng vòng lặp while đó.

Nguyễn Trí Dân viết 19:45 ngày 30/09/2018

Cám ơn bạn nhiều lắm, mình hiểu rồi

Bài liên quan
0