2015-09-19 4 views
2

J'ai rencontré cette erreur lorsque j'essaie de modifier le code où le nom du chromosome ne suit pas le nom de mon chromosome. Fondamentalement, le code ci-dessous est de lire le fichier d'entrée et de notifier l'emplacement de la séquence plus courte et de sortir la séquence de localisation en fonction de l'information donnée dans le fichier. Par exemple dans chr4: 154742507-154742714, la valeur 151 indique l'emplacement des premières bases et l'emplacement 'CCCAGGCTGG' est 173 - 182. Par conséquent, en utilisant le code ci-dessous devrait être capable de me renvoyer l'emplacement exact en ajoutant 173 à 154742507 et obtenir la sortie ci-dessous. Quelqu'un peut-il m'aider?Python: comment générer le nom du chromosome correct dans la sortie?

Voici le code avec un exemple de fichier texte d'entrée.

Entree.txt

chr4:154742507-154742714 


          CCCAGGCTGG 
151 AGTCTTGCTTTTTTTGTCGTTGCCCAGGCTGGAGTGCAGTGGCACCATCTCGGCTCAC 


chr9:47303792-47303999 

     CCAGCCTGGG 
1 TCCAGCCTGGGTGACAGCGTGAGGCTCTTGTCTCAAATAGAAAAAAAACAAAGAACAAAAAACAAAAAACCACCA 

sortie

chr1 154742680 154742690 
chr1 47303794 47303804 

sortie prévue

chr4 154742680 154742690 
chr9 47303794 47303804 

code

import re # regular expressions, not needed (alternatives: the `split` method) but convenient 

result = [] 
output_file=open('output.bed','w') 
with open('Input.txt') as f: 
    for line in f: 
     if line.startswith('chr'): 
      label = line.strip() 
     elif line[0] == ' ': 
      # short sequence 
      length = len(line.strip()) 
      # find the index of the beginning of the short sequence 
      for i, c in enumerate(line): 
       if c.isalpha(): 
        short_index = i 
        break 
     elif line[0].isdigit(): 
      # long sequence 
      n = line.split(' ')[0] 
      # find the index of the beginning of the long sequence 
      for i, c in enumerate(line): 
       if c.isalpha(): 
        long_index = i 
        break 
      start = int(n) + short_index - long_index 
      start -= 1 
      end = start + length 
      result.append('{} {} {}'.format(label, start, end)) 
      offset, n, start, length = 0, 0, 0, 0 
output_line= "\n".join(result) 
output_file.write(output_line) 
output_file.close() 

output_file=open('last_output.bed','w') 
with open('output.bed') as fin: 
    for line in fin: 
     start, _, offset_start, offset_end = re.search(r'[^:]*:(\d+)\D+(\d+)\D+(\d+)\D+(\d+)', line).groups() 
     output_line=('chr1\t{}\t{}\n'.format(int(start) + int(offset_start) + 1,int(start) + int(offset_end) + 1)) 
     output_file.write(output_line) 
output_file.close() 

Répondre

4

Si je comprends bien la question, le problème que vous rencontrez n'a qu'à voir avec le nombre de chromosomes (chr##) qui est mal sorti.

Cela semble un peu évident. A la fin de votre code, vous êtes dur coder:

output_line=('chr1\t{}\t{}\n'.format(stuff)) 

Si vous ne voulez pas la sortie de montrer toujours chr1, vous aurez besoin de changer cela. La regex sur la ligne précédente semble correspondre au numéro de chromosome du fichier, vous ne le capturez pas dans un groupe que vous pouvez utiliser plus tard. Essayez:

chromosome, start, _, offset_start, offset_end = re.search(r'([^:]*):(\d+)\D+(\d+)\D+(\d+)\D+(\d+)', line).groups() 
output_line=('{}\t{}\t{}\n'.format(chromosome, int(start) + int(offset_start) + 1,int(start) + int(offset_end) + 1)) 

Ceci est encore plutôt moche, mais devrait fonctionner. Notez que cela serait beaucoup plus facile si vous faisiez la sortie correcte de votre boucle initiale, plutôt que d'écrire un format intermédiaire et que vous deviez ensuite le reparer.

+0

Merci. Il est résolu maintenant =) – Xiong89