2017-07-24 79 views
2

我有一個函數可以計算我的數據的「或者」或者「類型的列表。如何從同一個函數中的兩個循環獲取結果?

keyword = sys.argv[1] # a name from the Name column 

def exon_coords(): 
    exon_start_plus = [] # Plus strand coordinates 
    exon_start_minus = [] # Minus strand coordinates 
    for line in csv.reader(sys.stdin, csv.excel_tab): 
     if len(line) >= 1: 
      if re.search(keyword, str(line)): # If arg keyword exists in file 
       if line[3] == "-": # If the DNA strand is a minus strand 
        chrompos = line[0] + ";" # Get the chromosome position 
        exon_start_minus.append(chrompos+line[1]) # Full exon position 
       else: # all other lines are plus strands 
        chrompos = line[0] + ";" 
        exon_start_plus.append(chrompos+line[1]) 

return exon_start_minus, exon_start_plus #Return lists 

目標是然後用座標寫出輸出文本文件。

with open(keyword+"_plus.txt", "w") as thefile: 
    for item in exon_start_plus: 
     thefile.write("{}, ".format(item)) 

,或者如果關鍵字產生了負鏈:

with open(keyword+"_minus.txt", "w") as thefile: 
    for item in exon_start_minus: 
     thefile.write("{}, ".format(item)) 

我試圖把這些寫入文件的代碼內,但隨後恢復功能只是不會給我的完整列表,我結束了每次只寫一個座標。我把它們放在最後,但是這會導致空文件和空字符串 - 我想將它作爲一個函數,並確定關鍵字(即基因ID)是否具有給定的加/減鏈的座標(我有一個巨大的數據文件包含這些數據,重點是不要手動掃描這些ID並查看它們是否爲加/減DNA鏈)。

謝謝!

EDIT(樣本數據,不得不讓我編輯的代碼,以及去除一些列):

Position Start End Strand Overhang Name 
1 3798630 3798861 + . ENSPFOG0000001 
1 3799259 3799404 + . ENSPFOG0000001 
1 3809992 3810195 + . ENSPFOG0000001 
1 3810582 3810729 + . ENSPFOG0000001 
2 4084800 4084866 - . ENSPFOG0000002 
2 4084466 4084566 - . ENSPFOG0000002 
2 4084089 4084179 - . ENSPFOG0000002 

所以,如果我用ENSPFOG0000001作爲我的關鍵字,那麼腳本應該運行,並確定股線另外,收集列表中的起始座標,然後輸出一個只有座標的文件。該文件將附加關鍵字+「_ plus.txt」。如果是ENSPFOG0000002,那麼它將收集負鏈座標,並創建一個文件,其中創建關鍵字+「_ minus.txt」。

+0

你是說'''''exon_coords()'''不工作? – wwii

+0

你能提供一個來自你將傳遞給'csv.reader'的輸入文件的最小樣本嗎? –

+0

exon_coords()工作,但我的返回語句會導致一個空的列表(因爲我先設置了兩個空列表,這樣它可以將結果附加到正確的列表中),然後列出我的座標。然後,我希望腳本根據創建的列表創建適當的標題文件。 – DNAngel

回答

0

空列表值爲False:

>>> exon_start_minus, exon_start_plus = [], [] 
>>> bool(exon_start_minus), bool(exon_start_plus) 
(False, False) 
>>> exon_start_minus, exon_start_plus = [1], [] 
>>> bool(exon_start_minus), bool(exon_start_plus) 
(True, False) 
>>> exon_start_minus, exon_start_plus = [1], [1] 
>>> bool(exon_start_minus), bool(exon_start_plus) 
(True, True) 
>>> exon_start_minus, exon_start_plus = [], [1] 
>>> bool(exon_start_minus), bool(exon_start_plus) 
(False, True) 

所以,你可以測試一個空列表並採取適當

>>> if exon_start_plus: 
    print('!!!') 

!!! 
>>> if exon_start_minus: 
    print('!!!') 

>>> 

從函數獲取兩個列表動作:

exon_start_minus, exon_start_plus = exon_coords() 
相關問題