2009-08-19 8 views
0

J'ai un fichier comme ci-dessous.Produire plusieurs fichiers à partir d'un seul fichier en python

Séquence A.1.1 Les bactéries
ATGCGCGATATAGGCCT
ATTATGCGCGCGCGC

Séquence A.1.2 Virus
ATATATGCGCCGCGCGTA
ATATATATGCGCGCCGGC

Séquence B.1.21 Chimpanzé
ATATAGCGCGCGCGCGAT
ATATATATGCGCG

Séquence C.21.4 humaine
ATATATATGCCGCGCG
ATATAATATC

Je veux faire des fichiers séparés pour les séquences de catégorie A, B et C à partir d'un seul fichier. Veuillez suggérer du matériel de lecture pour avoir enfreint ce code. Merci. La sortie doit être composée de trois fichiers, un pour 'A', un deuxième fichier pour les séquences avec 'B' et un troisième fichier pour les séquences avec 'C'.

+0

sont-ils pas des séquences d'ADN supposées être extrêmement longue? –

+0

Perl n'est-il pas l'outil traditionnel pour analyser des séquences d'ADN? Ne vous méprenez pas, je ne pousse pas Perl - je déteste quand quelqu'un suggère un outil autre que celui que je connais. Je ne suis pas vraiment familier avec Python, mais je ne l'ai jamais considéré comme un langage de "traitement de texte". Je vais lire les deux réponses à cette question très attentivement. Même avec Perl, je pense que les séquences d'ADN doivent être découpées en morceaux gérables pour le traitement. – pavium

+0

@pavium, consultez http://biopython.org/wiki/Main_Page - Python est très populaire dans de nombreux domaines de la science, ainsi que pour les applications de traitement de texte. –

Répondre

1

Ce n'est pas clair à 100% ce que vous voulez faire, mais quelque chose comme:

currout = None 
seqname2file = dict() 

for line in open('thefilewhosenameyoudonottellus.txt'): 
    if line.startswith('Sequence '):  
    seqname = line[9] # A or B or C 
    if seqname not in seqname2file: 
     filename = 'outputfileforsequence_%s.txt' % seqname 
     seqname2file[seqname] = open(filename, 'w') 
    currout = seqname2file[seqname] 
    currout.write(line) 

for f in seqname2file.values(): 
    f.close() 

vous devriez assez proche - si vous voulez trois fichiers séparés (un pour A, B et C) parmi eux contiennent toutes les lignes du fichier d'entrée, il est à peu près fait, sauf que vous aurez probablement besoin de meilleurs noms de fichiers (mais vous ne nous laissez pas sur le secret de ce que ceux-ci pourraient être ;-), sinon quelques réglages devraient l'obtenir Là.

BTW, il aide toujours énormément (pour vous aider plus efficacement plutôt que de trébucher dans l'obscurité et deviner) si vous aussi donner des exemples de ce que les résultats de sortie que vous voulez pour les données d'entrée exemple que vous donnez -)

+0

Ouais merci de bien vouloir vérifier la sortie ci-dessus –

+0

Certainement m'a eu près. J'obtiens un index d'erreur hors limites. Puis-je faire quelque chose comme ça en Python Index = ligne [9] puis si (indice == 'a') j'obtiens l'erreur –

+0

Vous pouvez faire index = ligne [9] si et seulement si Len (ligne) est au moins 10; Apparemment, vous le faites sur une ligne plus courte que celle-là. –

0

Je ne sais pas exactement ce que vous voulez que la sortie soit, mais il semble que vous besoin de quelque chose comme:

#!/usr/bin/python 

# Open the input file 
fhIn = open("input_file.txt", "r") 

# Open the output files and store their handles in a dictionary 
fhOut = {} 
fhOut['A'] = open("sequence_a.txt", "w") 
fhOut['B'] = open("sequence_b.txt", "w") 
fhOut['C'] = open("sequence_c.txt", "w") 

# Create a regexp to find the line naming the sequence 
Matcher = re.compile(r'^Sequence (?P<sequence>[A-C])') 

# Iterate through each line in the file 
CurrentSequence = None 
for line in fhIn: 
    # If the line is a sequence identifier... 
    m = Matcher.match(line) 
    if m is not None: 
     # Select the appropriate sequence from the regexp match 
     CurrentSequence = m.group('sequence') 
    # Uncomment the following two lines to skip blank lines 
    # elif len(line.strip()) == 0: 
    #  pass 
    # Print out the line to the current sequence output file 
    # (change to else if you don't want to print the sequence titles) 
    if CurrentSequence is not None: 
     fhOut[CurrentSequence].write(line) 

# Close all the file handles 
fhIn.close() 
fhOut['A'].close() 
fhOut['B'].close() 
fhOut['C'].close() 

complètement non testé si ...

+0

Merci. Le plus apprécié. –

Questions connexes