2017-01-15 3 views
0

Ich arbeite an einem Skript, das mehrere Fastq-Dateien in Fasta und Qual konvertiert. Immer wenn ich es ausführe, hat das Skript danach null Bytes.Warum löscht sich mein Python-Skript selbst?

import sys 
import re 
import os 
import fileinput 
from Bio import SeqIO 
from Bio.Alphabet import IUPAC 

Directory = "https://stackoverflow.com/users/etc" 
def process(Directory): 
    filelist = os.listdir(Directory) 
    for f in filelist: 
     SeqIO.convert(f, "fastq", f.replace(".fastq",".qual"), "qual", alphabet=IUPAC.ambiguous_dna) 

my_directory = "https://stackoverflow.com/users/etc" 
process(my_directory) 

ich mit dabei sowohl fastq Kampf und qual Umsatz bei gleichzeitig fasta - nur die SeqIO.convert Linie das Kopieren und die Dateiformate Austausch der Trick nicht tun ... Außerdem würde ich gerne Lassen Sie eine Zahl drucken, wie viele Dateien konvertiert wurden.

Prost

+1

Passen Sie die Dateiberechtigungen an, um das Skript schreibgeschützt zu machen. Sehen Sie, welche Operation fehlschlägt, wenn Sie sie ausführen - dann wissen Sie, was sie überschreibt. –

+0

Dies kann auch nicht Ihr tatsächlicher Code sein - er hat einen Einrückungsfehler und wird nicht ausgeführt. –

+0

Entschuldigung, geändert! – rororo

Antwort

6

In dieser Schleife:

filelist = os.listdir(Directory) 
for f in filelist: 
    SeqIO.convert(f, "fastq", f.replace(".fastq",".qual"), "qual", alphabet=IUPAC.ambiguous_dna) 

... Sie Looping jede Datei in Ihrem Verzeichnis über .

Nicht jede Datei außer Ihrem Python-Skript oder jede Datei, die in .fastq endet, aber jede Datei.

Da 'yourscript.py'.replace('.fastq', '.qual') immer noch 'yourscript.py' ist, überschreibt dies dann das Python-Skript, indem es versucht, es sowohl als Ausgabe als auch als Eingabe zu verwenden.


Also, es gibt ein paar Hinweise hier:

  • Daten halten und Code getrennt. Idealerweise in völlig anderen Verzeichnissen. Ein $HOME/bin Verzeichnis ist ein geeigneter Ort, um eigenen Code zu behalten - wenn Sie dieses Verzeichnis zu Ihrem PATH hinzufügen, können Sie ausführbare Befehle von überall ausführen.
  • Filtern Sie in Ihrer Schleife Dateinamen, die nicht in .fastq enden. Das kann wie folgt aussehen:

    for f in filelist: 
        if not f.endswith('.fastq'): 
         continue 
        SeqIO.convert(f, 'fastq', f[:-len('.fastq')]+'.qual', 'qual', alphabet=IUPAC.ambiguous_dna) 
    
  • Da diese Prüfung nach dem Hinzufügen wir wissen, dass .fastq am Ende eine Datei existiert, können wir damit ein wenig effizienter über ihn zu ersetzen - stattdessen durch die von der Suche Ganzer Name für die Zeichenfolge, wir können nur so viele Zeichen vom Ende abschneiden und dann stattdessen die neue Erweiterung aktivieren. Dies ist ein wenig schneller und bedeutet, dass wir keinen Teil eines Dateinamens außer der Erweiterung ändern.

+0

Wohoo .. machte meinen Tag! – rororo

Verwandte Themen