我正在处理一个非常大的压缩文本文件“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)
答案 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)
您可以自行决定如何为每个基因分配一个唯一的文件名 - 也许使用该行中的其他数据?