2009-08-14 6 views
1

Séquence 1.1.1 ATGCGCGCGATAAGGCGCTA
ATATTATAGCGCGCGCGCGGATATATATATATATATATATT
Séquence 1.2.2 ATATGCGCGCGCGCGCGGCG
ACCCCGCGCGCGCGCGGCGCGATATATATATATATATATATT
Séquence 2.1.1 ATTCGCGCGAGTATAGCGGCGComment éliminer le dernier chiffre de chacune des lignes haut

maintenant, je souhaite supprimer le dernier chiffre de chacune des lignes commençant par '>'. Par exemple, dans cette première ligne, je voudrais supprimer '.1' (le plus à droite) et dans la deuxième instance je voudrais supprimer '.2', puis écrire le reste du fichier dans un nouveau fichier. Merci,

+7

Hey! C'est * mon * ADN! – balpha

+0

beaucoup de bonnes réponses pythoniennes ... sympa! – jwoolard

+2

Êtes-vous impliqué dans un projet de type Jurassic Park? – Tom

Répondre

4
if line.startswith('>Sequence'): 
    line = line[:-2] # trim 2 characters from the end of the string 

ou s'il pourrait y avoir plus d'un chiffre après la période:

if line.startswith('>Sequence'): 
    dot_pos = line.rfind('.') # find position of rightmost period 
    line = line[:dot_pos] # truncate upto but not including the dot 

Modifier pour si la séquence se produit sur la même ligne que> Séquence

Si nous sachez qu'il n'y aura toujours qu'un seul chiffre à supprimer, nous pourrons découper la période et le chiffre avec:

line = line[:13] + line[15:] 

Ceci utilise une caractéristique de Python appelée tranches. Les index sont basés sur zéro et exclusifs pour la fin de la plage, donc line[0:13] nous donnera les 13 premiers caractères de line. Sauf que si nous voulons commencer au début, le 0 est optionnel donc line[:13] fait la même chose. De même line[15:] nous donne la sous-chaîne commençant au caractère 15 à la fin de la chaîne.

+0

Que faire si j'ai ce cas > Séquence 1.1.1 atgcgcgcgatatat ashhshshsh Donc maintenant je dois seulement enlever ".1" mais pas un seul chiffre sur le côté droit ou côté gauche, juste le dernier numéro ".1" ou quoi que ce soit.Merci –

+0

Etes-vous en train de dire que l'atgcgcgcgatatat est sur la même ligne que la séquence 1.1.1 ou que c'est juste la façon dont votre commentaire a été formaté? S'il vous plaît expliquer un peu plus ce que vous voulez dire – mikej

+0

Bien sûr. Oui vous avez bien interprété. La séquence atgcgcgatga est sur la même ligne. Donc, dans ce cas, je dois maintenant retirer le dernier chiffre de la série de chiffres. Une chose est sûre que ce dernier chiffre sera toujours présent sur le 15ème index sur chaque ligne commençant par '>'. –

2

carte "".join(line.split('.')[:-1]) à chaque ligne du fichier.

7
import fileinput 
import re 

for line in fileinput.input(inplace=True, backup='.bak'): 
    line = line.rstrip() 
    if line.startswith('>'): 
    line = re.sub(r'\.\d$', '', line) 
    print line 

beaucoup de détails peuvent être modifiés en fonction des détails du traitement que vous voulez, que vous ne l'avez pas clairement communiqué, mais c'est l'idée générale.

+2

Utilisation cool de fileinput. Je n'avais jamais entendu parler de ce module. – hughdbrown

+0

Merci à tous. Cela a aidé –

+0

Alors Arshan, acceptez une réponse qui vous a aidé le plus - c'est l'étiquette fondamentale de StackOverflow! –

4
import re 
trimmedtext = re.sub(r'(\d+\.\d+)\.\d', '$1', text) 

Devrait le faire. Un peu plus simple que de chercher des caractères de départ (et cela n'affectera pas vos chaînes d'ADN)

+0

semble très bien, mais désolé n'a pas pu comprendre votre code. J'ai commencé à python hier alors pourriez-vous être très gentil pour commencer avec l'ouverture du fichier? Merci. –

+0

@Arshan: Avez-vous déjà lu le tutoriel Python? Cela devrait vous aider à comprendre les étapes de base telles que la lecture de fichiers et l'itération de lignes pour vous donner le contexte de l'utilisation de cette solution. –

+0

Oli utilise ce qu'on appelle une expression régulière pour effectuer une substitution sur le texte. Ces modèles tels que (\ d + \. \ D +) \. \ D sont un concept général et non spécifique à Python. – mikej

1

Voici un petit script. Exécutez-le comme: script [filename to clean]. Beaucoup de traitement des erreurs omis.

Il fonctionne en utilisant des générateurs, donc il devrait aussi bien fonctionner sur les gros fichiers.

import sys 
import os 

def clean_line(line): 
    if line.startswith(">"): 
     return line.rstrip()[:-2] 
    else: 
     return line.rstrip() 

def clean(input): 
    for line in input: 
     yield clean_line(line) 

if __name__ == "__main__": 
    filename = sys.argv[1] 

    print "Cleaning %s; output to %s.." % (filename, filename + ".clean") 

    input = None 
    output = None 
    try: 
     input = open(filename, "r") 
     output = open(filename + ".clean", "w") 
     for line in clean(input): 
      output.write(line + os.linesep) 
      print ": " + line 
    except: 
     input.close() 
     if output != None: 
      output.close() 
0
import re 

input_file = open('in') 
output_file = open('out', 'w') 

for line in input_file: 
    line = re.sub(r'(\d+[.]\d+)[.]\d+', r'\1', line) 
    output_file.write(line) 
+0

Merci beaucoup. Ça a marché. –

+0

Un problème s'il vous plaît. Il fonctionne quand j'ai 1.9.1 etc, donc il supprime le dernier chiffre, mais quand j'ai 2.10.1, cela ne fonctionne pas. –

+0

Résolus. Je vous remercie. –

Questions connexes