2017-05-11 9 views
1

ある文字の場所を表す変数siteに基づいて特定の文字列を抽出するテキストファイルがあります。私はsiteの位置の前後に20文字を抽出したいと思います。 siteの値が20を超えると、コードは正常に動作します。ただし、siteより前に20文字未満であれば、何も返しません。Pythonでファイルから文字列を取得

たとえば、ここにはsite=5の文字列があります。この場合、Kです。

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の前にチャーターを印刷しませんでした。

正しいものはであったはずです。

これは私の質問に私をもたらします。 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 

それとも、Pythonは自動的にクリップがインデックスをスライスので、シーケンスの終わりを超えて上限のため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ケースを記述します。

関連する問題