使用python将两个文件合并为一组通用标识符

时间:2014-02-03 23:34:44

标签: python merge

我想合并两个共享一个公共列的制表符分隔文本文件。我有一个'标识符文件',看起来像这样(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])  

谢谢!

2 个答案:

答案 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文件。

我建议用这个粗略的解决方案做一些假设:

  1. 第一个文件中的“基因”是唯一会出现的“基因” 在第二个文件中。
  2. 第一个文件中可能会复制“基因”。
  3. 首先在第一个文件中构建数据的映射:

    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)