2017-02-02 3 views
0

ich mit vielen Sequenzen wie folgt eine fasta Datei haben:fasta Sequenz Automatisieren abrufen für viele Dateien

>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene 
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG 
AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG 
>gi|2765659|emb|Z78553.1|CIZ78553 C.irapeanum 5.8S rRNA gene 
AATTTCAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG 
AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG 
>gi|2765668|emb|Z78531.3|CIZ78531 C.irapeanum 5.8S rRNA gene 
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG 
Auch

, ich habe ein id.file mit einigen Gen-IDs, die ich die Sequenzen aus dem fasta abrufen möchten Datei und die Ausgabe mit entsprechenden Gene und Sequenzen erhalten, zum Beispiel:

gi|2765658|emb|Z78533.1|CIZ78533 
gi|2765659|emb|Z78553.1|CIZ78553 

Mein output sein wird:

>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene 
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG 
AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG 
>gi|2765659|emb|Z78553.1|CIZ78553 C.irapeanum 5.8S rRNA gene 
AATTTCAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG 
AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG 

Aber ich habe viele id.files (500 Dateien - idfile1.txt idfile2.txt, idfile3.txt, etc.) mit verschiedenen Gruppen von Genen, und ich habe ein Python-Skript, diesen Job für nur eine Datei zu einem Zeitpunkt zu tun, aber Ich würde es gerne für meine 500 Dateien gleichzeitig machen. Mein Python-Skript ist:

#!/usr/bin/python 
from Bio import SeqIO 

fasta_file = "fastafile.fa" # Input fasta file 
wanted_file = "idfile1.txt" # Input interesting sequence IDs, one per line 
result_file = "out1.fasta" # Output fasta file 

wanted = set() 
with open(wanted_file) as f: 
    for line in f: 
     line = line.strip() 
     if line != "": 
      wanted.add(line) 

fasta_sequences = SeqIO.parse(open(fasta_file),'fasta') 
with open(result_file, "w") as f: 
    for seq in fasta_sequences: 
     if seq.id in wanted: 
      SeqIO.write([seq], f, "fasta") 

Wie kann ich eine Schleife dafür machen? Ich habe nur eine Fasta-Datei, aber viele ID-Dateien. Ich bin neu in Python, also bin ich mir nicht sicher, wie es geht. Oder vielleicht kann ich ein Shell-Skript mit einer Schleife für dieses Skript ausführen? Ich bin mir nicht sicher, weil ich die Dateinamen darauf einfügen muss.

Irgendwelche Vorschläge?

Antwort

0

Id sagen os ist dein Freund hier. Angenommen, Ihr Ordner enthält mehrere Dateitypen, aber alle Textdateien mit der Endung txt sollen behandelt werden. Ich denke, dass jede Eingabedatei eine eigene Ergebnisdatei benötigt, so müssen wir uns kümmern, dass:

#!/usr/bin/python 
from Bio import SeqIO 
import os 

fasta_file = "fastafile.fa" # Input fasta file 


mypath='/home/usr/data/mydatafolder'#your path here 
for file in os.listdir(mypath): 
    if file.endswith(".txt"):#as you probably have others there as well 
     wanted_file=os.path.join(mypath,file)#absolute path to file 

     wanted = set()###clearing for every new file 
     with open(wanted_file) as f: 
      for line in f: 
       line = line.strip() 
       if line: 
        wanted.add(line) 

     result_file=os.path.join(mypath, 'result_'+wanted_file) 
     #this puts the output of, e.g. idfile17.txt in result_idfile17.txt 

     with open(result_file, "w") as f: 
      for seq in fasta_sequences: 
       if seq.id in wanted: 
        SeqIO.write([seq], f, "fasta") 

oder wenn Sie wissen, wie die Dateinamen aufgebaut sind, zB:

#!/usr/bin/python 
from Bio import SeqIO 
import os 

fasta_file = "fastafile.fa" # Input fasta file 
fasta_sequences = SeqIO.parse(open(fasta_file),'fasta') 

mypath='/home/usr/data/mydatafolder'#your path here 

filenamelist=["idfile{}.txt".format(x) for x in range(100)] 
#files from 0 to 99 
### or maybe some specific numbers? 
# filenamelist=["idfile{}.txt".format(x) for x in [1,20,30,50,117] ] 


for file in filenamelist: 
    wanted_file=os.path.join(mypath,file)#absolute path to file 
    ####now the same thing as before 
    wanted = set()###clearing for every new file 
    with open(wanted_file) as f: 
     for line in f: 
      line = line.strip() 
      if line: 
       wanted.add(line) 

    result_file=os.path.join(mypath, 'result_'+wanted_file) 
    #this puts the output of, e.g. idfile17.txt in result_idfile17.txt 
    with open(result_file, "w") as f: 
     for seq in fasta_sequences: 
      if seq.id in wanted: 
       SeqIO.write([seq], f, "fasta") 

Beachten Sie, dass Sie könnten auch leicht eine unabhängige Liste für Ausgabedateinamen erstellen.

+0

Meinst du diesen Teil in meinem ursprünglichen Skript hinzufügen? Beim Betteln?Und wie wäre es mit den Dateinamen in meinem Skript (gewünschte Datei und Ausgabe?) – Paul

+0

@Anna Ich werde bearbeiten, um es klar zu machen. – mikuszefski

0

können Sie glob verwenden. In der Präambel (oben in der Datei):

import glob 

dann

ersetzen
with open(wanted_file) as f: 

mit

for wanted_file in glob.glob("/path/to/files/id*.txt"): 
    with open(wanted_file) as f: 
     ... 

alle FASTA Dateinamen unter der Annahme, sind im Format id*.txt und befinden sich im Verzeichnis /path/to/files/ Ordner. Stellen Sie sicher, dass Sie den folgenden Code korrekt einrücken.

+0

Ich bin mir nicht sicher, ob ich verstanden habe. Ich muss diesen Teil in meinem ursprünglichen Python-Skript hinzufügen? Und entfernen Sie die "wantedfile =" idfile1.txt ""? – Paul

0

ich wie vorgeschlagen versucht, aber wahrscheinlich viele Fehler, die ich tue:

#!/usr/bin/python 
from Bio import SeqIO 
import glob 

fasta_file = "fasta_final.fa" # Input fasta file 

for wanted_file in glob.glob("/data/ids/id*.txt"): 
    with open(wanted_file) as f: 

     wanted = set() 
     with open(wanted_file) as f: 
      for line in f: 
       line = line.strip() 
       if line != "": 
        wanted.add(line) 

fasta_sequences = SeqIO.parse(open(fasta_file),'fasta') 
with open(result_file, "w") as f: 
    for seq in fasta_sequences: 
     if seq.id in wanted: 
      SeqIO.write([seq], f, "fasta") 

aber nicht funktioniert, Fehlermeldung lautet: Nameerror: name 'result_file' definiert ist, nicht

I enthalten die Ergebnisdatei, aber abhängig von der ID-Datei werden viele Ergebnisdateien erwartet. Ich bin mir nicht sicher, was ich tun soll!

+0

Zuerst sollten Sie einen fehlgeschlagenen Versuch nicht als Antwort veröffentlichen. Sie können dies als Bearbeitung zum ursprünglichen Beitrag hinzufügen. Zweitens, da Sie result_file nirgendwo definiert haben, wird dies erwartet. Sie müssen einen Ausgabedateinamen für jeden Durchlauf der Schleife definieren. Siehe meine Antwort dafür. – mikuszefski

Verwandte Themen