在python中的文本文件中按第一个值查找行

时间:2014-01-30 16:29:50

标签: python

我正在尝试使用单独的“标识符文件”(2列1050行)从大的制表符分隔文本文件(18列乘20600行,'目标文件')中提取行。标识符文件包含第二列中的标识符,我需要与目标文件中的标识符匹配(目标文件中的第1列)。目标是在目标文件中找到所有1050个匹配,并为每个匹配的1050行提取所有18个(标识符+17个值)值(即,创建18x1050文件,其中公共标识符中的第一列)。我试图在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()]

我希望得到一些帮助,以便更好地做到这一点。

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

你不清楚你想要什么。一个例子会有所帮助。据我所知,您想要检查每一行的模式列表。你有很多模式和大量的线条。更好的是使用正则表达式。这样的事情:

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

如果他们有特殊的字符,你可能不得不逃避你的模式。

答案 2 :(得分:0)

首先,list = list.append()不会做你想要的。 list.append()是一个列表方法,它将参数附加到列表并返回None,因此您只需在每次迭代时将列表设置为None

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