2016-04-09 89 views
1

遇到麻煩我的功能在8個地方切分字符串(DNA代碼)並返回它們。我是新來的rstrip()和split()函數,我想我可能需要在這裏使用它們,但我不太明白。切片字符串並返回拼接的字符串

這裏是我的代碼:

input2=open('queryfile.txt','r') 

def slice_seq(a,b,c,d,e,f,g,h,query_seq): 
    query_seq=input2 
     slice_1=query_seq[a:b + 1] 
     slice_2=query_seq[c:d + 1] 
     slice_3=query_seq[e:f + 1] 
     slice_4=query_seq[g:h + 1] 
    return slice_1,slice_2,slice_3,slice_4 

a=146 
b=917 
c=2381 
d=2737 
e=1 
f=155 
g=917 
h=1057 
answer=slice_seq(a,b,c,d,e,f,g,h,input2) 
print(answer) 

查詢文件看起來是這樣的:

emb|AJ000012.1| Mycobacterium tuberculosis recA gene (strain Canetti) 
CGAAAGGTCAGATCCGGGCCGGTGAGCACGCCGGATCCGGCCAGGCTAGCGGTGTTCAGCAGATCGTCGG 
TGATCCGGACCAGCCGCGCACGCAAGTCGGGCCGCACCGCCGCCAGGGCGTTCGACGCGCCGACGAGCGC 
GGACGCGATGTTGCCACACGCGGCGTGTCACACTTGAATCGAACAGGTGTTCGGCTACTGTGGTGATCAT 
TCGGAGCAGCCGACTTGTCAGTGGCTGTCTCTAGTGTCACGGCCAACCGACCGATACCGGTCAATCGAAC 
ACCGACCACAGGAGAGGCACCATGACGCAGACCCCCGATCGGGAAAAGGCGCTCGAGCTGGCAGTGGCCC 
AGATCGAGAAGAGTTACGGCAAAGGTTCGGTGATGCGCCTCGGCGACGAGGCGCGTCAGCCGATTTCGGT 
CATTCCGACCGGATCCATCGCACTCGACGTGGCCCTGGGCATTGGCGGCCTGCCGCGTGGCCGGGTGATA 
GAGATATACGGCCCGGAATCTTCGGGTAAGACCACCGTGGCGCTGCACGCGGTGGCCAACGCTCAGGCCG 
CCGGTGGTGTTGCGGCGTTCATCGACGCCGAGCACGCGCTGGATCCGGACTATGCCAAGAAGCTCGGTGT 
CGACACCGATTCGCTGCTGGTCAGCCAGCCGGACACCGGGGAACAGGCACTCGAGATCGCCGACATGCTG 
ATCCGCTCGGGTGCGCTTGACATCGTGGTGATCGACTCGGTGGCGGCGCTGGTGCCGCGCGCGGAGCTCG 
AAGGCGAGATGGGCGACAGCCACGTCGGGCTGCAGGCCCGGCTGATGAGCCAGGCGCTGCGGAAAATGAC 
CGGCGCGCTGAATAATTCGGGCACCACGGCGATCTTCATCAACCAGCTCCGCGACAAGATCGGAGTGATG 
TTCGGGTCGCCCGAGACGACAACGGGCGGAAAGGCGTTGAAGTTCTACGCGTCGGTGCGCATGGACGTGC 
GGCGGGTCGAGACGCTCAAGGACGGTACCAACGCGGTCGGCAACCGCACCCGGGTCAAGGTCGTCAAGAA 
CAAGTGCCTCGCAGAGGGCACTCGGATCTTCGATCCGGTCACCGGTACAACGCATCGCATCGAGGATGTT 
GTCGATGGGCGCAAGCCTATTCATGTCGTGGCTGCCGCCAAGGACGGAACGCTGCATGCGCGGCCCGTGG 
TGTCCTGGTTCGACCAGGGAACGCAGGATGTGATCGGGTTGCGGATCGCCGGTGGCGCCATCGTGTGGGC 
GACACCCGATCACAAGGTGCTGACAGAGTACGGCTGGCGTGCCGCCGGGGAACTCCGCAAGGGAGACCGG 
GTGGCGCAACCGCGACGCTTCGACGGATTCGGTGACAGTGCGCCGATTCCGGCGGATCATGCCCGGCTGC 
TTGGCTACCTGATCGGAGATGGCAGGGATGGTTGGGTGGGGGGCAAGACTCCGATCAACTTCATCAATGT 
TCAGCGGGCGCTCATTGACGACGTGACGCGAATCGCTGCGACGCTCGGTTGTGCGGCCCATCCGCAGGGG 
CGTATCTCACTCGCGATCGCTCATCGACCCGGTGAGCGCAACGGGGTACTGGACCTTTGTCGGCGGGCCG 
GTGTGCACGGCAAGCTCGCGTGGGAGAAGACGATTCCGAATTGGTTCTTCGAGCCGGACATCGCGGCCGA 
CATTGTCGGCAATCTGCTCTTCGGCCTGTTCGAAAGCGACGGGTGGGTGAGCCGGGAACAGACCGGGGCA 
CTTCGGGTCGGTTACACGACGACCTCTGAACAACTCGCGCATCAGATTCATTGGCTGCTGCTGCGGTTCG 
GTGTCGGGAGCACCGTTCGAGATTACGATCCGACCCAGAAGCGGCCGAGCATCGTCAACGGTCGACGGAT 
CCAGAGCAAACGTCAAGTGTTCGAGGTCCGGATCTCGGGTATGGATAACGTCACGGCATTCGCGGAGTCA 
GTTCCCATGTGGGGGCCGCGCGGTGCCGCGCTTATCCAGGCGATTCCAGAAGCCACGCAGGGGCGGCGTC 
GTGGATCGCAAGCGACATATCTGGCTGCAGAGATGACCGATGCCGTGCTGAATTATCTGGACGAGCGCGG 
CGTGACCGCGCAGGAGGCCGCGGCCATGATCGGTGTAGCTTCCGGGGACCCCCGCGGTGGAATGAAGCAG 
GTCTTAGGTGCCAGCCGCCTTCGTCGGGATCGCGTGCAGGCGCTCGCGGATGCCCTGGATGACAAATTCC 
TGCACGACATGCTGGCGGAAGAACTCCGGTATTCGGTGATCCGAGAAGTGCTGCCAACGCGGCGGGCACG 
AACGTTCGACCTCGAGGTCGAGGAACTGCACACCCTCGTCGCCGAAGGGGTTGTCGTGCACAACTGTTCG 
CCCCCCTTCAAGCAGGCCGAGTTCGACATCCTCTACGGCAAGGGAATCAGCAGGGAGGGCTCGCTGATCG 
ACATGGGTGTGGATCAGGGCCTCATCCGCAAGTCGGGTGCCTGGTTCACCTACGAGGGCGAGCAGCTCGG 
CCAGGGCAAGGAGAATGCCCGCAACTTCTTGGTGGAGAACGCCGACGTGGCTGACGAGATCGAGAAGAAG 
ATCAAGGAAAAGCTTGGCATTGGTGCCGTGGTGACCGATGACCCCTCAAATGACGGTGTCCTGCCCGCCC 
CCGTCGACTTCTGAGCGCGAAGAGCAGGCGCGGGCACTGTGCCTGCGCCTGCTCACCGCGCGATCCCGCA 
CCCGCGC 

任何幫助,將嚴重感謝!我很確定我的問題是如何處理查詢文件,以便函數可以識別它並對其進行分片?

+1

它被稱爲切片不拼接。 – TheRandomGuy

+1

什麼是你的代碼中的input1? – Francesco

+0

哎呀,謝謝你指出那個Dhruv。 – pythonbeginner2506

回答

1

我會想你是不是切片該文件中的標頭,敏銳的,所以你必須先跳過它,一種方式或其他:

with open('queryfile.txt') as input2: 
    # Consume the header 
    next(input2) # or input2.readline() 

功能則已經閱讀由線到字符串文件中的行,去除換行,因爲它有云:

dna = ''.join(row.strip() for row in query_seq) 

如何傳遞層號的功能有點我也建議改變:

def slice_seq(query_seq, *slices): 

這樣,你的函數接受0或更多片作爲位置參數,片是索引的元組。把它放在一起你會得到:

def slice_seq(query_seq, *slices): 
    # feel free to use rstrip, if strip seems redundant 
    dna = ''.join(row.strip() for row in query_seq) 
    return [dna[a:b + 1] for a, b in slices] 

a=146 
b=917 
c=2381 
d=2737 
e=1 
f=155 
g=917 
h=1057 

with open('queryfile.txt') as input2: 
    next(input2) 
    answer = slice_seq(input2, (a, b), (c, d), (e, f), (g, h)) 

print(*answer, sep='\n') 
+0

這很棒,謝謝!正在努力處理查詢文件中的行。究竟是什麼sep ='\ n',我認爲這是什麼把新線在我的輸出?我從來沒有見過它。 – pythonbeginner2506

+1

打印時,[print](https://docs.python.org/3/library/functions.html#print)用於分隔多個參數,這是簡短的分隔符。它默認爲一個空格。函數調用上下文中的星號[將列表解壓縮爲打印位置參數](https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists)。 –

2

在功能slice_seq中,刪除行query_sec = input2。這是一個錯誤。您尚未在函數中創建一個名爲input2的變量,並且沒有參數被命名爲so。這是一個錯誤。您不能將函數中的變量設置爲另一個變量。您必須首先全球化其他變量。

2

我不清楚從結果應該是4片還是8的問題。下面是一個試圖推廣你的代碼。此代碼在列表列表中返回4個切片。第一個片段來自a-> b,第二個來自c-> d,第三個來自e-> f,第四個來自g-> h。

def slice_seq(slice_positions, filename): 
    with open(filename, 'r') as myfile: 
     data=myfile.read().replace('\n', '') 
     slice_out = [data[slice[0]:slice[1]+1] for slice in slice_positions] 
    return slice_out 

slice_positions = [(146, 917), (2381, 2737), (1, 155), (917, 1057)] 
filename = 'queryfile.txt' 
slice_out = slice_seq(slice_positions, filename) 
print(slice_out) 

從A-> B切片是:

slice_out[0] 

選自c-d的片是:

slice_out[1] 

作爲等。

+1

我會使用[列表理解](https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions):'slice_out = [data [slices [0]:slices [1] + 1]用於slice_len]中的切片。爲了使其更具可讀性,還將重命名參數'slice_len' - >'slices',並使用'slice_out = [data [slice] [slice] [slice] 1]]切片。 – martineau

+0

Thanks @martineau我已編輯按照您的建議 – ljk07