我正在处理一个非常大的压缩文本文件”值.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)
在这里你可以做两件事。在
首先,看起来你在你的查找表中存储了代表第一个文件的geneID的数量。如果第二个文件中的数量与第一个文件中的类型和值相同,则可以像这样更有效地搜索查找表:
代码段:
第二,如果你想为每个基因取一个唯一的名字,你的文件应该是内部循环,而不是外部循环。像这样:
^{pr2}$它将取决于你想如何为每个基因分配一个唯一的文件名-也许使用行中的其他数据?在
相关问题 更多 >
编程相关推荐