2016-04-25 2 views
1

Ich habe über 14000 Fasta-Dateien, und ich möchte nur diejenigen, die 5 Sequenzen enthalten. Ich weiß, dass ich den folgenden bash Befehl verwenden kann, um die Anzahl der Sequenzen in einer einzigen fasta-Datei zu erhalten:Verwenden von Python Subprozess.Call zum Schreiben der Anzahl der Fasta-Sequenzen in Datei

grep -c "^>" filename.fasta 

Also mein Ansatz, die die Dateinamen und Anzahl der Sequenzen in jeder Datei in eine Textdatei zu schreiben war, die Ich könnte dann nur die gewünschten Sequenzen isolieren. Um auf so viele Dateien mit dem grep Befehl ausführen, ich bin mit subprocess.call:

import subprocess 
import os 


with open("five_seqs.txt", "w") as f: 
    for file in os.listdir("/Users/vivaksoni1/Downloads/DA_CDS/fasta_files"): 
     f.write(file), 
     subprocess.call(["grep", "-c", "^>", file], stdout = f) 

Teil meines Problems ist, dass der Befehl grep ist „^>“, aber subprocess erfordert jedes Argument, um seine eigenen Anführungszeichen haben . Wie kann ich "^>" verwenden, wenn ich im Wesentlichen als Argument eintreten würde: "" ^> "".

Muss ich auch f.write ("\ n") nach f.write (file) hinzufügen? Derzeit ist meine Ausgabe nur eine Textdatei mit jedem Eintrag nebeneinander, und der Unterprozessbefehl druckt nur jeden Dateinamen auf dem Terminal und gibt keine Datei als solche an:

grep: MZ23900789.fasta: Keine solche Datei oder Verzeichnis

+0

haben Sie versucht: 'shell = True 'auf der' subprocess.call() '? Beispiel: 'subprocess.call ([" grep "," -c "," ^> ", Datei], stdout = f, shell = True)' –

+0

Hallo, ich habe das leider erfolglos versucht. Der Befehl grep wird immer noch nicht in die Datei geschrieben, und ich bekomme diese Ausgabe für jede Datei an das Terminal: usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-Anum] [-Bnum] [-C [num]] \t [-e Muster] [-f Datei] [- Binärdateien = Wert] [--color = wenn] \t [--kontext [= num]] [--directories = Aktion] [-] [--line-gepuffert] \t [--null] [Muster] [Datei ...] – spiral01

+0

bekomme eine Datei, nur um zu testen: 'grep -c '^>' fasta_file '.. funktioniert es, wenn tut es, dann versuche: 'subprocess.call ([" grep "," -c "," '^>' ", Datei], stdout = f, shell = True)' Sonst stimmt etwas anderes nicht, sezieren und testen Sie das Ruf an jeder Ecke. 'pdb' ist dein Freund -' ipdb' ist dein BESTER Freund –

Antwort

2

Probieren Sie den folgenden Code, es sollte für Ihr Beispiel funktionieren. Es wird den Dateinamen plus ein Tab-Trennzeichen und die Anzahl der Sequenzen schreiben (d. H. > Zeichen). Die Verwendung von Popen und communicate bietet eine höhere Flexibilität bei der Verarbeitung der Ausgabe. Getestet auf Ubuntu.

import subprocess 
import os 

fasta_dir = "/Users/vivaksoni1/Downloads/DA_CDS/fasta_files/" 

with open("five_seqs.txt", "w") as f: 
    for file in os.listdir(fasta_dir): 
     f.write(file + '\t') 
     grep = subprocess.Popen(["grep", "-c", "^>", fasta_dir + file], stdout = subprocess.PIPE) 
     out, err = grep.communicate() 
     f.write(out + '\n') 
+0

Das funktioniert perfekt. Danke vielmals. – spiral01