2017-05-12 7 views
0

我想對兩個文件執行一些區間範圍操作,並且出現以下條件 檢查chrom是否相等,然後檢查我的co0rdinatefile的開始和結束是否在相等或相等開始和結束gene_annotation文件(條件如果鏈是「+」,開始和結束將是例如10-20,如果它的「 - 」將是20-10),如果匹配打印開始末尾鏈從座標和來自geneannotation文件的gene_id,gene_name。 (用於表示目的,我有頭annoataion文件)使用熊貓或枚舉查找兩個數據集之間的重疊/範圍

中的行數註釋文件〜50000 數協調的文件中的行〜200000

gene_annotationfile

chrom  start  end    gene_id gene_name strand 
17 71223692 71274336 ENSMUSG00000085299  Gm16627  - 
17 18186448 18211184 ENSMUSG00000067978 Vmn2r-ps113  + 
11 84645863 84684319 ENSMUSG00000020530  Ggnbp2  - 
7 51097639 51106551 ENSMUSG00000074155   Klk5  + 
13 31711037 31712238 ENSMUSG00000087276  Gm11378  + 

coordinates_file

chrom start end strand 
    1 4247322 4247912 - 
    1 4427449 4432604 + 
    1 4763414 4764404 - 
    1 4764597 4767606 - 
    1 4764597 4766491 - 
    1 4766882 4767606 - 
    1 4767729 4772649 - 
    1 4767729 4768829 - 
    1 4767729 4775654 - 
    1 4772382 4772649 - 
    1 4772814 4774032 - 
    1 4772814 4774159 - 
    1 4772814 4775654 - 
    1 4772814 4774032 + 
    1 4774186 4775654 - 
    1 4774186 4775654 
    1 4774186 4775699 - 

想要的輸出

chrom, start, end,strand, gene_id, gene_name 
1  4427432 4432686 + ENSMUSG0001 abcd 

另一個問題是,在某些情況下,如果有匹配它可以映射到在這種情況下,gene_id我還想寫

chrom, start, end,strand, gene_id, gene_name 
1  4427432 4432686 + ENSMUSG0001,ENSMUSG0002 abcd,efgh 

我迄今爲止代碼:

import csv 

with open('coordinates.txt', 'r') as source: 
     coordinates = list(csv.reader(source, delimiter="\t")) 

with open('/gene_annotations.txt', 'rU') as source: 
     #if i do not use 'rU' i get this error Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode? 
     annotations = list(csv.reader(source, delimiter="\t")) 

for index,line in enumerate(coordinates): 

    for index2, line2 in enumerate(annotations): 


     if coordinates[line][0] == annotations[line2][0] and coordinates[line][1] <= annotations[line2][1] and annotations[line2][2] >= coordinates[line][2] : 
     print "%s\t%s\t%s\t%s\t%s" % (coordinates[line][0],coordinates[line][1],coordinates[line][2], annotations[line2][3], annotations[line2][4]) 
     break 

錯誤我得到

---> 15   if coordinates[line][0] == annotations[line2][0] and coordinates[line][1] <= annotations[line2][1] and annotations[line2][2] >= coordinates[line][2] : 
16    print "%s\t%s\t%s\t%s\t%s" % (coordinates[line][0],coordinates[line][1],coordinates[line][2], annotations[line2][3], annotations[line2][4]) 
17    break 

TypeError: list indices must be integers, not list 

大熊貓會是一個很好的方法嗎?

回答

1

我假設座標是列表的列表,如[[1,2],[3,4]]。 線

for index,line in enumerate(coordinates): 

迭代座標,返回座標線的各條線和索引爲索引。

if coordinates[line][0] == annotations[line2][0] and coordinates[line][1] <= annotations[line2][1] and annotations[line2][2] >= coordinates[line][2] : 

錯誤消息表示您在此處使用列表(行)作爲索引。你可能想改用線的指標:

if coordinates[index][0] == annotations[index2][0] and coordinates[index][1] <= annotations[index2][1] and annotations[index2][2] >= coordinates[index][2] : 

更妙的是隻使用線:

if line[0] == line2[0] and line[1] <= line2[1] and line2[2] >= line[2] : 

看到https://docs.python.org/2.7/reference/compound_stmts.html?highlight=for_stmt#grammar-token-for_stmt