我正在尝试使用单独的“标识符文件”(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()]
我希望得到一些帮助,以便更好地做到这一点。
答案 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
。
至于问题的其余部分,一个例子会有所帮助。