2011-05-03 5 views
3

나는 작업중인 생물 정보학 프로젝트에 약간의 코딩 문제가 있습니다. 기본적으로, 내 임무는 데이터베이스에서 모티프 시퀀스를 추출하고 정보를 사용하여 시퀀스 정렬 파일에 주석을 달아주는 것이다. 정렬 파일은 일반 텍스트이므로 주석은 정교한 파일이 아닙니다. 추출 된 시퀀스를 정렬 파일 자체의 별표로 바꾸는 것만으로도 정교합니다.Python의 ASCII 파일에서 부분 문자열 찾기/바꾸기

나는 데이터베이스 파일을 스캔하고 필요한 모든 시퀀스를 추출하여 출력 파일에 기록하는 스크립트를 가지고 있습니다. 쿼리가 있으면이 시퀀스를 읽고 ASCII 정렬 파일의 해당 부분 문자열과 일치시켜야합니다. 마지막으로 모티프 시퀀스 (매우 큰 문자열의 하위 문자열)가 나타날 때마다 모티프 시퀀스 XXXXXXX를 별표 시퀀스로 바꿉니다. *.

내가 사용하고 코드는 (11SGLOBULIN 데이터베이스에서 단백질 항목의 이름입니다) 이렇게되면 :

motif_file = open('/users/myfolder/final motifs_11SGLOBULIN','r') 
align_file = open('/Users/myfolder/alignmentfiles/11sglobulin.seqs', 'w+') 
finalmotifs = motif_file.readlines() 
seqalign = align_file.readlines() 


for line in seqalign: 
    if motif[i] in seqalign: # I have stored all motifs in a list called "motif" 
     replace(motif, '*****') 

하지만 그 대신 별표 (*)의 순서로 각 문자열을 대체, 그것은 전체 파일을 삭제합니다 . 왜 이런 일이 일어나는 지 알 수 있습니까?

필자의 ASCII 파일은 기본적으로 하나의 매우 긴 아미노산 목록이며, Python은 매우 긴 문자열 내에 숨겨진 특정 부분 문자열을 대체하는 방법을 알 수 없다고 생각됩니다.

+1

무엇이'i'이고'replace'입니까? – geoffspear

+0

나는 1996 년과 1999 년 사이 런던에서 생화학을 연구 한 스파이 로스를 알았다. 어쨌든. 이 '대체'기능은 무엇입니까?파일 내용을 변경하려면 새 파일을 만든 다음 이전 파일을 바꾸는 것이 좋습니다. 이렇게하면 실행에 문제가있는 경우 종료 상태를 확인하고 데이터가 손실되지 않도록 할 수 있습니다. – MattH

+0

@Wooble, replace는 하나의 문자열을 다른 문자열로 바꾸는 문자열 처리 명령입니다. motif [i]는 일련의 문자열을 포함하는 motif라는 목록에 대한 색인 방법입니다. – Spyros

답변

2

다음과 같은 것이 트릭을 수행해야합니다. 샘플을 게시하지 않았고 Python 2.7을 실행 중이므로 입력 데이터에 대한 가정을했습니다.

motifs = [ x.strip() for x in open('final motifs_11SGLOBULIN','r') ] 
redact = '*****' 

with open('11sglobulin.seqs','r') as data_in, open('11sglobulin.seqs.new','w') as data_out: 
    for seq in data_in: 
    for motif in motifs: 
     while True: 
     x = seq.find(motif) 
     if x >= 0: 
      seq = seq[:x] + redact + seq[x+len(motif):] 
     else: 
      break 
    data_out.write(seq) 
+0

모두 감사합니다. 응답에 정말 감사드립니다. 그래서 기본적으로 내가 한 일은, 많은 사람들이 지적했듯이 파일에 주석을 달고 그 주석을 새 파일에 쓰는 것입니다. 코드 의이 비트는 속임수를 않았다 – Spyros

1

당신은 루프에서 동안 가장 안쪽을 변경하여이 좀 더 단순화 수 :

while True: 
    x = seq.find(motif) 
    if x >= 0: 
     seq = seq[:x] + redact + seq[x+len(motif):] 
    else: 
     break 

에 :

if motif in seq: 
    seq = seq.replace(motif, redact) 
2

당신은 w+ 파일 모드를 오해하고 있습니다. w+open과 함께 사용하면 파일이 자르며 (즉, 파일의 모든 내용이 삭제됩니다) http://docs.python.org/library/functions.html#open을 참조하십시오. 귀하의 서열 데이터는 즉시 전화로 사라 : 또한 replace

align_file = open('/Users/myfolder/alignmentfiles/11sglobulin.seqs', 'w+')

이 파일에서 읽은 문자열에서 작동 할 것이다. 변경된 문자열을 명시 적으로 작성해야합니다.

가장 좋은 방법은 세 번째 파일을 사용하여 결과를 저장하는 것입니다. 작업을 완료하면 원래 파일 인 align_file에 결과 파일을 복사 할 수 있습니다.

+0

오, 그래, 그 오래된 밤. 잘 보였다. 그 자리에서 파일을 편집하는 것에 대한 더 큰 오해를 고려해 보았습니다. – MattH

+0

@MattH 예, 이제 원본을 손상시키지 않도록 내가 읽은 파일에 주석을 달고이 주석을 새 파일에 써야한다고 이해합니다. 팁을 제공해 주셔서 감사합니다! – Spyros

+0

'a +'모드가 필요합니다 ... 이것을 지적 해 주셔서 감사합니다! – Spyros

0

답장을 보내 주셔서 감사합니다. 답장을 보내 주셔서 감사합니다. 그래서 기본적으로 내가 한 일은, 많은 사람들이 지적했듯이 파일에 주석을 달고 그 주석을 새 파일에 쓰는 것입니다. 이 코드는 트릭을 만들었습니다.

align_file_rmode = open('/Users/spyros/folder1/python/printsmotifs/alignfiles/query, 'r') 
align_file_amode = open('/Users/spyros/folder1/python/printsmotifs/alignfiles/query, 'a+') 

finalmotifs = motif_file.readlines() 
seqalign = align_file_rmode.readlines() 

for line in seqalign: 
    for item in finalmotifs: 
     item = item.strip().upper() 
     if item in line: 
     line = line.replace(item, '$' * len(item)) 
     align_file_amode.write(line) 

motif_file.close() 
align_file_rmode.close() 
align_file_amode.close()