2014-01-30 66 views
0

我試圖使用單獨的「標識符文件」(2列1050行)從大製表符分隔的文本文件(18行20600行,'目標文件')中提取行行)。標識符文件包含第二列中需要與目標文件中的標識符匹配的標識符(目標文件中的列1)。目標是找到目標文件中的所有1050個匹配項,併爲每個匹配的1050行提取所有18個(標識符+ 17值)值(即,創建一個18x1050文件,其中公共標識符中的第一列)。我試圖在沒有太多好運的情況下在python中完成此操作。這是我試過的:通過python中的文本文件中的第一個值查找行

gene_values=[] 
with identifier as genelist: 
    for line in genelist: 
    parts_genelist=text.split() 

    with target as expression: 
    for line in expression: 
     parts_expression=text.split() 

     if parts_genelist[1]==parts_expression[0]: 
      gene_values=gene_values.append[genelist.readlines(), expression.readlines()] 

我將不勝感激一些輸入和一些幫助做得更好。

+1

請發佈「目標文件」和「標識符文件」的片段/樣本 – Potrebic

+0

出了什麼問題?你有一些小的示例輸入文件來演示預期的和實際的輸出嗎?另外,代碼中的「text」是什麼:這個變量來自哪裏(和'identifier'一樣)。 – Evert

回答

1

這不應該是太困難:

閱讀所有標識符爲set

idents = set() 
with open("identifiers.txt") as ids: 
    for line in ids: 
     idents.add(line.split()[1]) 

然後通過你的目標文件迭代,檢查匹配標識符:

matches = [] 
with open("target.txt") as target: 
    for line in target: 
     items = line.split() 
     if items[0] in idents: 
      matches.append(items) 

(當然,我們可以用兩個單行(set和list comprehension)做同樣的事情,但我認爲這段代碼更容易理解。)

with open("identifiers.txt") as ids, open("target.txt") as target: 
    idents = {line.split()[1] for line in ids} 
    matches = [line.split() for line in target if line.split()[0] in idents] 
+0

謝謝,這真的很有幫助。它部分地完成了我需要做的事情。還有一個問題:我想讓最終結果包含標識符文件中的更多內容。它在每行中組織爲module1 gene1。我想讓最終文件包含每個基因的模塊隸屬關係是一個單獨的列。使用idents.add(line.split()[0:1])不起作用,因爲我收到'不可用列表'錯誤。修改您創建的腳本以完成此任務的最簡單方法是什麼? – user3107521

+0

所以實際上你想合併這兩個文件,保持標識符匹配的每一行的所有信息?這是一個完全不同的問題,它需要一個不同的解決方案。我認爲如果你對此提出另一個問題(以及當你這樣做的時候給我留言),這將是最好的。 –

+0

謝謝,我在[鏈接]下發布了一個新問題(http://stackoverflow.com/questions/21509787/merge-two-tab-delimited-text-files-by-one-common-column-in-python) – user3107521

0

你不清楚你想要什麼。一個例子是有幫助的。據我所知,你想檢查每一行模式列表。你有很多圖案和大量的線條。更好的辦法是使用正則表達式。類似的東西:

compiled = re.compile("|".join("($"+pattern+")" for pattern in patterns)) 
out = [line for line in target_file if compiled.match(line)] 

如果他們有特殊的字符,你可能必須先逃脫你的模式。

0

首先,list = list.append()是不會做你想做的。 list.append()是將參數附加到列表並返回None的列表方法,因此您只需在每次迭代中將列表設置爲None即可。

至於問題的其餘部分,一個例子會有所幫助。

相關問題