2017-08-28 2 views
0

Ich bin sehr neu in Python, und ich habe ein Python-Skript für eine bestimmte Datei (input1.txt) ausgeführt und eine Ausgabe (output1.fasta) generiert, aber ich möchte dieses Skript für mehrere Dateien, beispielsweise auszuführen: input2.txt, input3.txt ... und erzeugt den jeweiligen Ausgang: output2.fasta, output3.fastaÄndern Python-Skript für mehrere Eingabedateien

from Bio import SeqIO 

fasta_file = "sequences.txt" 
wanted_file = "input1.txt" 
result_file = "output1.fasta" 

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") 

ich versuchte, die glob-Funktion hinzuzufügen, aber Ich weiß nicht, wie ich mit dem Namen der Ausgabedatei umgehen soll.

from Bio import SeqIO 
import glob 

fasta_file = "sequences.txt" 

for filename in glob.glob('*.txt'): 

    wanted = set() 
    with open(filename) 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") 

Die Fehlermeldung lautet: Nameerror: name ‚result_file‘ nicht

definiert ist
+1

was genau funktioniert nicht? Können Sie Ihren Code anzeigen, nachdem Sie mit glob versucht haben? – Verv

+1

Was funktioniert nicht mit glob? Sei spezifisch, damit wir helfen können. – kabanus

+0

Sorry, ich habe meine Frage mit der Fehlermeldung etc. aktualisiert. – Paul

Antwort

2

Ihre glob zur Zeit Ihre „Sequenzen“ Datei sowie die Eingänge weil *.txt enthält die sequences.txt Datei zieht. Wenn die „fasta“ Datei immer das gleiche ist und Sie nur die Eingabedateien zu durchlaufen, dann müssen Sie

for filename in glob.glob('input*.txt'): 

Auch durch den gesamten Prozess zu durchlaufen, vielleicht wollen Sie es innerhalb einer Methode setzen. Wenn der Ausgabedateiname immer so erstellt wird, dass er der Eingabe entspricht, können Sie ihn dynamisch erstellen.

from Bio import SeqIO 

def create_fasta_outputs(fasta_file, wanted_file): 
    result_file = wanted_file.replace("input","output").replace(".txt",".fasta") 

    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") 

fasta_file = "sequences.txt" 
for wanted_file in glob.glob('input*.txt'): 
    create_fasta_outputs(fasta_file, wanted_file) 
+0

ja meine fasta_file = "seams.txt" ist für alle Eingabedateien gleich. Ihr Befehl wird ohne Fehler ausgeführt, erstellt jedoch keine Ausgabe. – Paul

+0

Haben Sie Beispieldaten für die Dateien 'seams.txt' und' input1.txt'? Nun, da das Skript ausgeführt wird, ist es möglich, dass einige Ihrer Logik darin, wie zum Beispiel 'if line! =" ":' Oder 'if seq.id in wanted:' einen Mangel an Ausgabe verursachen. – jack6e

+0

Sie sind richtig, meine Schuld. Der Befehl läuft! Danke vielmals. – Paul

Verwandte Themen