Python이 설치된 폴더의 Lib 폴더안에 ABIFReader.py를 복사하여 넣어주고 사용하면 됨.
from ABIFReader import * # creates an instance of ABIFReader reader = ABIFReader(<filename>) # version of ABIF file reader.version # print all entries of ABIF file "<name> (<num>) / <type> (<size>)" reader.showEntries() # read data for entry named <name> with number <num>, by default <num> is 1 data = reader.getData(<name>[, <num>]) # close the file, since it is kept open reader.close()
본 파일을 이용하여 ABI3730xl에서 나온 ab1파일을 분석하는 경우 중간중간 몇몇 data type은 3500xl 버전을 참고해야되는 경우가 있었음. ABIF Type의 Description이 잘 맞지 않은 것인지 AB1파일을 로드할때 중간에 missing되는 것이 있는지 정확히는 모르겠음.
easy_install을 이용해서 사이트에 설명되어 있는데로 simplejson을 먼저 설치하고 python-twitter을 설치하니 잘 작동하네요.. ㅎㅎ
import twitter api = twitter.Api(username='username', passowrd='password') users = api.GetFriends() #함수 이름과 같이 친구들 목록 반환.. print [u.name for u in users] status = api.PostUpdate('python-twitter test!')
for root,dirs, files in os.walk(search_dirs): for file in files: if file[-3:].find('seq') != -1 or file[-3:].find('txt') != -1: print '>'+file.split('.')[0] for x in open(root+'/'+file): if x.find('>') != -1: pass else: print x, print
지금 이녀석의 경우 파일 확장자가 seq나 txt로 끝나는 파일만 인식을 하고 그냥 긁어오는 겁니다. -물론 그냥 shell로 할 수 있습니다. ^^
lists = [] for x in open(blast_result_file): lists.append((x.split('\t')[1]).strip())
if len(lists) > 1: lists.sort() last = lists[-1] for i in range(len(lists)-2,-1,-1): if last == lists[i]: del lists[i] else: last=lists[i]
db = SeqIO.parse(open(db_fasta_file), format='fasta')
ow = open(output+'.txt','w')
for rec in db: name = rec.description seq = rec.seq.tostring()
for x in lists: if name.strip() == x.strip() or (name.strip()).find(x.strip()) != -1: if name[:1] == '>': ow.write(name+'\n'+seq+'\n') else: ow.write('>'+name+'\n'+seq+'\n')
ow.close()
사용법은 지난번 스크립트와 동일 ex) this.py blast_output_file db_file output_file
blast_output_file의 형식은 blast돌릴때 -m 8 형식입니다. db_file은 fasta 형식이면 됩니다. 물론 blast_output_file에 gene 이름이 있어야 db_file에서도 찾아주겠죠..
ex) Blast프로그램 query db -m 8 -o blast_output_file 여기서 나온 blast_output_file에서 두번째 컬럼의 gene 이름으로 db_file에서 서열을 추출하는 방식입니다.
유전자 리스트(검색하는 DB 파일의 유전자 리스트로부터 유래된) 파일과 검색하고자 하는 db 파일 그리고 유전자 이름과 서열을 FASTA 형식으로 저장하는 파일 이름 필요 저장 파일의 확장자는 항상 ".txt"가 붙음 결과로 나오는 저장파일의 유전자 서열들에 대해서는 중복으로 존재 가능합니다.
lists = [] for x in open(list_file): lists.append(x.strip())
db = SeqIO.parse(open(db_file), format='fasta')
ow = open(output+'.txt','w')
for rec in db: name = rec.description seq = rec.seq.tostring()
for x in lists: if name.strip() == x.strip() or (name.strip()).find(x.strip()) != -1: if name[:1] == '>': ow.write(name+'\n'+seq+'\n') else: ow.write('>'+name+'\n'+seq+'\n')
ow.close()
사용 예 [test]$ python this.py gene_list_filedb_fileoutput_file_name
-빨간색으로 강조된 부분은 필요에 따라 수정 할것.
-파이썬 파일을 실행하는 경우 각 파일들이 실행되어지는 폴더에 있지 아니한 경우 절대 경로를 지정해줘야 잘 작동할께요.. 아마도..
약간의 응용을 하면 input file을 blast 결과파일로도 할 수 있음 (단, output format -m 8로 했을 경우)
input_file인 gene_list_file의 format
gene_list_file 보기
gene_name1 gene_name2 gene_name3 gene_name4
db_file의 경우 일반 fasta format이면 사용 가능
ex) Blast프로그램 query db -m 8 -o blast_output_file 여기서 나온 blast_output_file에서 두번째 컬럼의 gene 이름으로 db_file에서 서열을 추출하는 방식입니다.
lists = [] for x in open(list_file): lists.append(x.strip())
if len(lists) > 1: lists.sort() last = lists[-1] for i in range(len(lists)-2,-1,-1): if last == lists[i]: del lists[i] else: last=lists[i]
db = SeqIO.parse(open(db_file), format='fasta') ow = open(output+'.txt','w')
for rec in db: name = rec.description seq = rec.seq.tostring() for x in lists: if name.strip() == x.strip() or (name.strip()).find(x.strip()) != -1: if name[:1] == '>': ow.write(name+'\n'+seq+'\n') else: ow.write('>'+name+'\n'+seq+'\n') ow.close()
파이썬에 이런 모듈이.. 참.. 대단한듯... -파이썬에 감탄하면 지는거다.. 난 자바를 공부하고 있어야돼... ㅠ.ㅠ
쉽게말해 대용량 사전 -사전이라는 자료형 은근히 편했는데..
실제 사용 예로 EMBL CDS fasta파일을 읽어서 E. coli에서 나온 것만 골라서 뽑아주는 소스는 이렇게 만들 수 있습니다.
코드:
from Bio import SeqIO import shelve
seqs = SeqIO.parse(open('/data/embl/cds_nr.fasta'), format='fasta') db = shelve.open('ecoli.db')
for rec in seqs: if ('Escherichia coli' in rec.description and 'hypothetical' not in rec.description): name = rec.description.split()[0].split(':')[1] seq = rec.seq.tostring() db[name] = seq
나중에 EMBL ID로 검색할 때는 다음과 같이 open만 하면 검색할 수 있습니다.
코드:
import shelve db = shelve.open('ecoli.db') genes = ['100746833', '1008171518'] for gene in genes: print db[gene]
32G가 30여분 소요 됐다니.. 난 4.1G(nr, 한국시간 2009.3.5에 다운로드) 밖에 안돼네.. ㅋㅋ