2017-05-11 2 views
1

어떤 문자의 위치를 ​​나타내는 변수 site을 기반으로 특정 문자열을 추출하려는 텍스트 파일이 있습니다. site의 위치 전후 20자를 추출하고 싶습니다. site 값이 20 이상이면 코드가 제대로 작동합니다. 그러나 site 전에 20 문자 미만인 경우 아무 것도 반환하지 않습니다.파이썬에서 파일의 문자열 가져 오기

예를 들어 여기에 site=5K 인 문자열이 있습니다.

MSGRGKGGKGLGKGGAKRHRKVLRDXYZX 

는 지금은 20 개 문자의 앞 문자 K 후 추출하기 위해 노력하고 있습니다. 다음은 제 코드입니다.

data=myfile.read()  
str1 = data[site:site+1+20] 
temp = data[site-20:site] 
final_sequence = temp+str1 
print final_sequence 

이 나에게 KGGKGLGKGGAKRHRKVLRDX의 출력을 제공합니다. K 전에 20자를 찾을 수 없으므로 K 앞에 chaarcters가 인쇄되지 않았습니다.

정확도가 이어야합니다.

내 질문에 나를 데려다 준다. K의 값이 20 문자 미만인 경우 K 앞에 모든 문자를 인쇄하도록 코드를 수정하려면 어떻게해야합니까? 감사합니다.

답변

2

site-20이 음수이므로 문제는 Python이 시퀀스의 끝을 기준으로 인덱스를 고려하므로 슬라이스가 비어 있습니다 (첫 번째 인덱스는 마지막 인덱스보다 후쪽에 있기 때문에). 그냥 당신이 결코 0

data=myfile.read()  
str1 = data[site:site+1+20] 
temp = data[max(site-20, 0):site] 
final_sequence = temp+str1 
print final_sequence 

아니면 파이썬이 자동으로 클립이 인덱스를 슬라이스 때문에 시퀀스의 끝을지나 상한에 대한 min(site+1+20, len(data))를 사용할 필요가 없습니다 짧은

data=myfile.read()  
final_sequence = data[max(site-20, 0):site+1+20] 
print final_sequence 

주 이하로 없는지 확인 시퀀스 길이로.

+0

주목할만한. 매우 감사합니다. – Ghauri

0

파일 길이의 상한값과 하한값을 확인해야합니다. 음의 값 (위치 이전)은 검사되어야하고 상한 (위치 이후)에 대해서는 동일한 규칙이 검사되어야합니다.

0

첫 번째 대답은 MAX를 사용하는 것이 옳습니다. 다음 예제는 조건을 사용하는 비단뱀 방식입니다.

data = "MSGRGKGGKGLGKGGAKRHRKVLRDXYZX" 

str1 = data[site:site+1+20] 
if site <= 20: 
    temp = data[0:site] 
elif site > 20: 
    temp = data[site%20:site] 

print str1 + temp 

로직을 검증하기 위해 다른 데이터로 적절한 unittest 케이스를 작성하십시오.

관련 문제