我想合并两个共享一个公共列的制表符分隔文本文件。我有一个'标识符文件',看起来像这样(2列乘1050行):
module 1 gene 1
module 1 gene 2
..
module x gene y
我还有一个制表符分隔的'目标'文本文件,看起来像这样(36列乘12000行):
gene 1 sample 1 sample 2 etc
gene 2 sample 1 sample 2 etc
..
gene z sample 1 sample 2 etc
我想基于基因标识符合并这两个文件,并且具有来自标识符和目标文件的匹配表达式值和模块关联。基本上从标识符文件中获取基因,在目标文件中找到它们,并在一个文件中创建一个模块#,gene#和表达式值的新文件。任何建议都会受到欢迎。
我想要的输出是由标签分隔的基因ID标签模块关联标签样本值。
这是我提出的脚本。编写的脚本不会产生任何错误消息,但它会给我一个空文件。
expression_values = {}
matches = []
with open("identifiers.txt") as ids, open("target.txt") as target:
for line in target:
expression_values = {line.split()[0]:line.split()}
for line in ids:
block_idents=line.split()
for gene in expression_values.iterkeys():
if gene==block_idents[1]:
matches.append(block_idents[0]+block_idents[1]+expression_values)
csvfile = "modules.csv"
with open(csvfile, "w") as output:
writer = csv.writer(output, lineterminator='\n')
for val in matches:
writer.writerow([val])
谢谢!
答案 0 :(得分:1)
现有方法存在许多问题,其中最重要的是您丢弃了文件中的所有数据,除了每个文件中的最后一行。每个“for line in
”下的赋值将替换变量的内容,因此只有最后一行的最后一个赋值才会生效。
假设每个基因只出现在一个模块中,我建议您将“ids”读入字典,为每个格式保存模块:
geneMod = {}
for line in ids:
id = line.split()
geneMod[ id[0] ] = id[1]
然后你可以通过目标行,并为每一行拆分它,获取基因id gene= targetsplit[0]
并保存(或输出)相同的拆分字段,但插入模块值,例如:{{1 }}
答案 1 :(得分:1)
这些代码行没有按照您的期望去做:
for line in target:
expression_values = {line.split()[0]:line.split()}
for line in ids:
block_idents=line.split()
for gene in expression_values.iterkeys():
if gene==block_idents[1]:
matches.append(block_idents[0]+block_idents[1]+expression_values)
表达式值和block_idents将仅根据要更新它们的文件的当前行具有值。换句话说,随着更多行被读取,字典和列表不会“增长”。使用csv模块也可以轻松解析TSV文件。
我建议用这个粗略的解决方案做一些假设:
首先在第一个文件中构建数据的映射:
import csv
from collections import defaultdict
gene_map = defaultdict(list)
with open(first_file, 'rb') as file_one:
csv_reader = csv.reader(file_one, delimiter='\t')
for row in csv_reader:
gene_map[row[1]].append(row[0])
读取第二个文件并同时写入输出文件。
with open(sec_file, 'rb') as file_two, open(op_file, 'w') as out_file:
csv_reader = csv.reader(file_two, delimiter='\t')
csv_writer = csv.writer(out_file, delimiter='\t')
for row in csv_reader:
values = gene_map.get(row[0], [])
op_list = []
op_list.append(row[0])
op_list.extend(values)
values.extend(row[1:])
csv_writer.writerow(op_list)