从另一个文件中提取行并在python

时间:2017-06-08 21:57:18

标签: python parsing pattern-matching

我正在处理一个非常大的压缩文本文件“values.gz”,其中每个基因包含多个值,第二列中包含geneID,另一个小文本文件包含第四列中的唯一基因列表(“bed”。文本”)。我试图从values.gz文件中提取信息(除了使用bed.txt中的字典之外的所有文件),以获取bed.txt文件中列出的基因子集,并将其保存在每个基因的单独文件中。我无法在bash中执行此操作,因为文件太大而无法解压缩,所以我在python中尝试但是我是新手,而且我被困住了:我已经提取匹配的基因并将它们保存在文件中,但是如何保存每个基因的不同文件?

例如,bed.txt文件如下所示:

chr    start   end     gene_id
1       11868   11869   ENSG00000223972
1       29552   29553   ENSG00000227232
1       29806   29807   ENSG00000243485

values.gz文件如下所示:

SNP     gene    v1    v2  v3
rs1       ENSG00000223972       0.09      0.8       0.5
rs1       ENSG00000227232       -0.06     -0.5      0.6
rs1       ENSG00000237683       -0.05     -0.5      0.5
rs2       ENSG00000223972       0.09      0.8       0.3
rs3       ENSG00000227232       0.09      0.8      0.3

我正在寻找的输出是: ENSG00000223972.gz

rs1       ENSG00000223972       0.09      0.8       0.5
rs2       ENSG00000223972       0.09      0.8      0.3

ENSG00000227232.gz

rs1       ENSG00000227232       -0.06     -0.5      0.6
rs3       ENSG00000227232       0.09      0.8       0.3

(values.gz中的所有基因应该在床上具有匹配值(但不是100%确定!),但是床文件中将列出的更多基因与values.gz文件不匹配)

#! /usr/bin/env python
import gzip

lookup = dict()
my_file = open("bed.txt","r") 
for line in my_file.readlines():
    row = line.split()
    lookup[row[3]] = row[1:]
    # print lookup
my_file.close()

with open('MyOutFile', 'w') as outfile:
    with gzip.open("values.gz", "r") as eqtl:
        for line in eqtl.readlines():
            for key in lookup:
                if line.find(key) > -1: 
                    outfile.write(line)

在Paisanco的建议之后:

with gzip.open("values.gz", "r") as eqtl:
    for line in eqtl.readlines():
        row = line.split()
        gene = row[1]
        filename = gene+'.txt'
        if gene in lookup:
           # assign unique file name here, then
           if os.path.exists(filename):
               append_write = 'a'
           else:
               append_write = 'w'
           with open(filename,append_write) as outfile:
              outfile.write(line)

1 个答案:

答案 0 :(得分:1)

你可以在这做两件事。

一,看起来您正在从第一个文件中将代表geneID的数量存储在查找表中。如果该数量与第一个文件中的第二个文件中的类型和值相同,则可以更有效地搜索查找表,如下所示:

代码段:

for line in eqtl.readlines():
   row = line.split()
   if row[1] in lookup:
       # do something...

二,如果你想为每个基因命名一个唯一的名字,你的文件open和write应该是内部循环,而不是外部循环。像这样:

with gzip.open("values.gz", "r") as eqtl:
    for line in eqtl.readlines():
        row = line.split()
        if row[1] in lookup:
           # assign unique file name here, then
           with open ("UniqueFileNameForThisGene","w") as outfile:
              outfile.write(line)

您可以自行决定如何为每个基因分配一个唯一的文件名 - 也许使用该行中的其他数据?