2017-01-15 4 views
0

Я работаю над скриптом, который преобразует несколько файлов fastq в fasta и qual. Всегда, когда я запускаю его, после этого скрипт имеет нулевые байты.Почему мой скрипт python удаляет себя?

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) 

борюсь с выполнением как fastq в Fasta И каче преобразования в то же время - просто скопировав SeqIO.convert линию и обмениваясь форматы файлов не делает трюк ... Кроме того, я хотел бы есть число, напечатанное о том, сколько файлов было преобразовано.

Приветствие

+1

Отрегулируйте права доступа к файлу, чтобы сценарий был доступен только для чтения. Посмотрите, какая операция завершается с ошибкой при ее запуске, - тогда вы узнаете, что ее переписывает. –

+0

Кроме того, это не может быть ваш фактический код - он имеет ошибку отступа и не будет работать. –

+0

извините, изменен! – rororo

ответ

6

В этом цикле:

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

... вы зацикливание над каждым файлом в каталоге.

Не каждый файл, кроме вашего скрипта Python, или каждый файл, который заканчивается на .fastq, но каждый файл.

Поскольку 'yourscript.py'.replace('.fastq', '.qual') по-прежнему 'yourscript.py', это перезаписывает скрипт Python, пытаясь использовать его как вывод, так и вход.


Итак, есть несколько замечаний здесь:

  • Хранить данные и код отдельно. В идеале, в совершенно разных каталогах. Каталог $HOME/bin является подходящим местом для хранения вашего собственного кода - если вы добавите этот каталог в свой PATH, вы можете запускать в нем исполняемые команды из любого места.
  • В вашей петле отфильтруйте имена файлов, которые не заканчиваются на .fastq. Это может выглядеть следующим образом:

    for f in filelist: 
        if not f.endswith('.fastq'): 
         continue 
        SeqIO.convert(f, 'fastq', f[:-len('.fastq')]+'.qual', 'qual', alphabet=IUPAC.ambiguous_dna) 
    
  • С после добавления этой проверки мы знаем, что .fastq существует в конце имени файла, мы можем, таким образом, быть немного более эффективными о замене его - вместо того, чтобы искать через целое имя для строки, мы можем просто обрезать много символов с конца, а затем вместо этого наклеить новое расширение. Это немного быстрее и означает, что мы не модифицируем какую-либо часть имени файла, кроме расширения.

+0

Wohoo .. сборный мой день! – rororo

Смежные вопросы