2016-10-13 4 views
0

dna 시퀀스 파일에서 효소 절단을 읽는 간단한 프로그램을 만들려고합니다. 내 문제는 루프에서 첫 번째 블록을 반복 할 수 없다는 것입니다. 이걸 루프로 바꿀 수 있도록 내가 뭘 잘못하고 있니? 어떤 도움이라도 대단히 감사합니다, 감사합니다!왜 간단한 루프를 만들 수 없습니까?

sequence = open('sequence.txt').read().replace('\n','') 
enzymes = {} 
fh = open('enzymes.txt') 
print('Restriction Enzyme Counter') 
inez = input('Enter a Restricting Enzyme: ') 
def servx(): 
    for line in fh.readlines(): 
     (name, site, junk, junk) = line.split() 
     enzymes[name] = site 
     if inez in line: 
      xcr = site 
      print('Active Bases:', site) 
    for line in sequence.split(): 
     if xcr in line: 
      bs = (sequence.count(xcr)) 
      print('Enzyme', inez, 'appears', bs, 'times in Sequence.') 
servx() 
inez = input('Find another Enzyme? [Yes/No]:') 
if inez is 'Yes': 
    servx() 
fh.close() 
+2

어떻게 알 수 있습니까 루프는 아니다 달리는? – Falmarri

+1

일반적으로 상위에 함수를 넣은 다음 두 줄의 빈 줄을 입력하고 코드를 실행하면 일반적으로 더 읽기 쉽습니다. –

+0

나는 이것을 "단순한 루프"라고 부르지 않을 것이다. –

답변

0

당신은 당신이하지 생각하지 않을 수있는이 :

for line in fh.readlines(): 

.readlines()

는 전체 파일을 읽고 무엇을 읽고 반환합니다. 그래서 루프의 라인 변수는 파일의 한 줄만이 아니며 한 번에 전체 파일입니다. 따라서 for 루프는 파일 끝으로 읽었으므로 첫 번째 루프 이후에 파일을 반복 할 다른 요소가 없으므로 한 번만 실행됩니다. 기본적으로 파일에서 한 줄을 읽었지만 한 파일에서 전체 파일을 다 써 버렸습니다.

나는 당신이하고 싶었던 파일이 끝날 때까지 한 번에 한 줄을 읽어 어떻게 생각 :

for line in fh: 

또는 모두 함께 파일을 읽을의 더 나은 방법입니다

with open('filename.txt') as fh: 
    for line in fh: 
     print(line) 

마지막에게 방법은 당신을 위해 그것을 처리하는 파일 fh.close()을 요구하지 않습니다. inez이 같은 인스턴스가

if inez is 'Yes':

이 확인하는 경우 :하지만 최후의 수단으로도 여기에

+0

'line' 변수 *는 * 한 줄이지만 파일 핸들이 다 소모됩니다. –

+0

맞아요, 그게 문제가 아니에요, 나는 OP가 한 번에 한 줄씩 읽고 싶다고 생각했습니다. 제가 입력 한 내용이 충분히 명확하지 않다고 생각합니다. 이 주제가 닫힌 경우에도 업데이트됩니다. – MooingRawr

0

for line in fh: 지금까지 두 번 이상 실행 함수 servx()을 방지 코드에서 문제가되는 사용하는 방법을 알 리터럴 문자열 'Yes'입니다. 이것은 모든 의도와 목적으로 항상 거짓을 반환합니다. 당신이 원하는 것은이 대신이다

는 자신 오브젝트 인스턴스 반대로 문자열이 여기에이 질문에 따라, 일치하는지 확인

if inez == 'Yes'

: Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?

+0

'inez가 '예'이면'True'가 반환 될 것입니다. 직접 해보십시오. 변수는 리터럴 문자열에 대한 참조의 일종입니다. 'id (a)'와'id ('foo')'를 보라. – solarc

+0

@solarc 나는 파이썬 콘솔에서 그것을 시도하고 그것은 나를 위해'False'를 반환했습니다. 그게 왜 일어날 지 알고 있니? 나는이 질문을 여기에두고있다. http://stackoverflow.com/questions/1504717/why-does-comparing-strings-in-python-using-either-or-is-sometimes-produce –

+0

흥미 롭다. 'id ('yes') '가'id (' '. join ((' 'y', 'e', ​​s ')))와는 다른 것 같습니다. 나는 그들이 똑같이 끝날 것이라고 생각했다. 이것은 'yes'== ''.join ((''y ','e ', s'))'가 참이지만''yes ''는''join (('y', 'e ','s '))'거짓. 나는 오늘 새로운 것을 배웠다. – solarc

관련 문제