2014-01-30 93 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即可。

至于问题的其余部分,一个例子会有所帮助。

相关问题