在python中,从另一个文件中提取行并将唯一的字段保存在单独的文件中

2024-10-02 00:28:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个非常大的压缩文本文件”值.gz,在第2列中包含每个基因的多个值,在第4列中包含另一个包含唯一基因列表的小文本文件(“床.txt"). 我试图从值.gz文件(不用全部阅读,只使用字典床.txt)中列出的基因子集床.txt文件,并将其保存在每个基因的单独文件中。我无法在bash中执行此操作,因为文件太大而无法解压缩,所以我正在python中尝试,但我是一个新手,而且我被卡住了:我已经提取了匹配的基因并将它们保存在一个文件中,但是如何将每个基因保存到不同的文件中?在

例如床.txt文件如下所示:

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

在值.gz文件如下所示:

^{pr2}$

我想要的输出是: ENSG0000223972.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

(所有基因值.gz床上应该有一个匹配的值(但不是100%确定!),但床文件中会列出更多与值.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)

Tags: 文件intxtforwithline基因open
1条回答
网友
1楼 · 发布于 2024-10-02 00:28:06

在这里你可以做两件事。在

首先,看起来你在你的查找表中存储了代表第一个文件的geneID的数量。如果第二个文件中的数量与第一个文件中的类型和值相同,则可以像这样更有效地搜索查找表:

代码段:

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

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

^{pr2}$

它将取决于你想如何为每个基因分配一个唯一的文件名-也许使用行中的其他数据?在

相关问题 更多 >

    热门问题