2017-08-04 3 views
1

Ich habe ein Skript, das FASTA Sequenzen sortiert, alphabetisch basierend auf Strings nach>. Hier ist ein Beispiel für Code, der mit einer einzigen Eingabedatei 35.fas arbeitet.Wie führe ich das Python-Skript für viele Dateien aus?

import os, sys 
import argparse 
from Bio import SeqIO 

records = list(SeqIO.parse("35.fas", "fasta")) 
records.sort(key=lambda x : x.id) 
SeqIO.write(records, "35-sorted.fas", "fasta") 

Beispiel fasta Datei:

>BAR 
ATCG 
>ABC 
TCGA 

korrekte Ausgabe:

>ABC 
TCGA 
>BAR 
ATCG 

Also, ich möchte dies für Hunderte von Dateien, um zu versuchen und versuchten 'sys.argv' war aber nicht dazu in der Lage. Ich möchte keinen anderen Ausgabenamen als * -sortiert für jede Datei haben. Ich möchte nur das Skript ausführen und alle Dateien in einem Ordner mit der Erweiterung .fas sortieren. Hier ist hat der Code nicht:

records = list(SeqIO.parse("sys.argv[0]", "fasta")) 
records.sort(key=lambda x : x.id) 
SeqIO.write(records, "sys.arg[0]-sorted.fas", "fasta") 
+0

'würde sys.argv' wird wahrscheinlich benötigt. Kannst du zeigen, wie du es benutzt hast? Welches Betriebssystem verwenden Sie? Das Problem könnte eine Begrenzung der Länge der Befehlszeile sein, wenn Sie Hunderte von Dateien haben. Möglicherweise müssen Sie das Verzeichnis angeben und der Python-Code die Dateien davon abrufen lassen. – pcarter

+0

Ich habe den Code zur Frage hinzugefügt und verwende macOS. Danke – Ramon

Antwort

2

Sie falsch sys.argv mit worden sein können, ist es ein Array aller Befehlszeilenparameter, wobei die ersten die Datei, die lief selbst, zum Beispiel bei der Suche zu sein folgende:

import sys 
for f in sys.argv: 
    print(f) 

Wenn Sie die Dateien a.txt, b.txt und c.txt auf das Skript ziehen wird es die folgenden (mit ... ist das Weglassen des vollständigen Pfad) drucken:

.../a.txt

.../b.txt

.../c.txt

Sie können diese in Ihrem Skript implementieren, wie:

import os, sys 
import argparse 
from Bio import SeqIO 

for f in sys.argv[1:]: 
    records = list(SeqIO.parse(f, "fasta")) 
    records.sort(key=lambda x : x.id) 
    SeqIO.write(records, f[:-4] + "-sorted.fas", "fasta") 
1

Es ist ziemlich einfach, alle iterieren die Dateinamen in sys.argv (Sie den ersten Eintrag weglassen sollte, die der Programmname ist) mit einer for Schleife. Sie haben dann das Problem, die Ausgabedateinamen zu generieren. Ich gehe aus Gründen der Argumentation davon aus, dass alle Dateinamen in '.fas' enden. Wenn das nicht der Fall ist, wären die String-Manipulationen ein kleiner Trick, aber nicht zu schrecklich.

import os, sys 
import argparse 
from Bio import SeqIO 

for filename in sys.argv[1:]: 
    records = list(SeqIO.parse(filename, "fasta")) 
    records.sort(key=lambda x : x.id) 
    outname = filename[:-4]+'-sorted.fas' 
    SeqIO.write(records, outname, "fasta") 

dieses Programm Angenommen wurden myprog.py genannt (und dass Sie nicht auf Windows, die Sie benötigen den Platzhalter Namen mit der glob.glob Funktion zu erweitern) Sie dann es nennen wie

python myprog.py *.fas 
+0

Danke. Es gibt Syntaxfehler! records = Liste (SeqIO.parse (Dateiname "," Fasta ")) ^ SyntaxError: ungültige Syntax – Ramon

+1

Entfernen Sie das unerwünschte Zitat am Ende des Dateinamens – peterjc

+0

Danke für das Hinweis auf meinen Tippfehler! Dyslexie ist ein Schmerz ... – holdenweb

Verwandte Themen