2017-11-30 15 views
0

上記のスクリプトを作成して、データベースから不要な遺伝子を削除しました。一度だけ使用するとうまくいきますが、再実行すると、次のようなエラーメッセージが表示されます。 shutil.Error:宛先パス 'path/rejected_database_genes/gene_A.fa'は既に存在します 明らかにそれは止まる。私は、ファイル内に2つ以上の遺伝子が削除される必要があるときに問題が発生すると思います。 よろしくお願いいたします。ご協力いただきありがとうございます。私は対処できるエラーを投げているpythonスクリプト

import glob, sys, os, shutil 
from Bio import SeqIO, SearchIO 
from Bio.SeqRecord import SeqRecord 
import argparse 

def help_function(): 
    print 'Hi' 
parser = argparse.ArgumentParser() 
parser.add_argument('-input_file', '-i',type=str,help='path_to_data') 
opts = parser.parse_args() 

def check_file_exists(filepath, file_description): 
    if not os.path.exists(filepath): 
     print("The " + file_description + " (" + filepath + ") does not exist") 
     sys.exit(1) 
    else: 
     print file_description + " detected" 

def remove_empty_files(alleles_files,destination): 
    input_handle=open(alleles_files, 'r') 
    gene_records=list(SeqIO.parse(input_handle, 'fasta')) 

    for gene_record in gene_records: 
     #filename=gene_record.id[0] 
     #count=0 
     if len(gene_record.seq)<5 or 'N'in gene_record.seq: 
      print gene_record.id 
     elif '-' in gene_record.seq: 
      print gene_record.id 
      #count+=1 
      shutil.move(alleles_files, destination) 

def main(): 
    destination=opts.input_file + '/rejected_database_genes' 
    if os.path.exists(destination): 
     print 'Folder already exits' 
    else: 
     os.makedirs(destination) 
     print 'Folder has been created' 
    files=glob.glob(opts.input_file+'/*.fa') 
    #print files 
    #sys.exit()  
    for f in files: 
     #print f 
     #sys.exit() 
     alleles_files=glob.glob(f)[0] 
     #print alleles_files 
     #sys.exit()   
     remove_empty_files(alleles_files,destination) 
    print 'Files have been removed' 
main() 
+0

スクリプトを実行し、結果ファイルを手作業で名前を変更してから再実行することはできますか? – Arne

+0

@ArneRecknagel。それは非常に良いバイオインフォマティクスの仕事ではありません。さらに、同じファイルから2つ以上の遺伝子を除去する必要がある場合に問題が生じる。 – Ana

+1

*ファイルを削除してもよろしいですか?コードでは、他の目的地に移動することを明らかに*しようとしています。 'shutil.move'を移動させたい場合、' shutil.move'はそれを既存の場所から削除して保存先に保存しようとしますが、ファイルが既に保存先に存在すると失敗する可能性があります。最も簡単な方法は、ファイルが宛先に存在するかどうかを確認して削除することです(例: 'os.remove')。それとも最初に削除してください。 – phoenix

答えて

0

私が欲しかったのは、スクリプトがそのファイルを削除したことが判明した時でした。私が抱えていた問題は、同じファイルに2つの不要なseqがあった場合、それが私のものであり、ファイルがすでに宛先に存在していて、停止しているというエラーでした。そこで、if文を追加することでこの問題を解決しました。修正スクリプトは、以下のいずれかです。

import glob, sys, os, shutil 
from Bio import SeqIO, SearchIO 
from Bio.SeqRecord import SeqRecord 
import argparse 

def help_function(): 
    print 'Hi' 
parser = argparse.ArgumentParser() 
parser.add_argument('-input_file', '-i',type=str,help='path_to_data') 
opts = parser.parse_args() 

def check_file_exists(filepath, file_description): 
    if not os.path.exists(filepath): 
     print("The " + file_description + " (" + filepath + ") does not exist") 
     sys.exit(1) 
    else: 
     print file_description + " detected" 

def remove_empty_files(alleles_files,destination): 
    input_handle=open(alleles_files, 'r') 
    gene_records=list(SeqIO.parse(input_handle, 'fasta')) 
    geneID_list=[] 
    for gene_record in gene_records: 
     filename=gene_record.id.split('_') 
     geneID=filename[0]+'_'+filename[1] 
     if len(gene_record.seq)<5 or 'N'in gene_record.seq: 
      geneID_list.append(geneID) 
      shutil.move(alleles_files, destination) 
      print geneID_list 
     #break    
     if '-' in gene_record.seq: 
      geneID_list.append(geneID) 
      shutil.move(alleles_files, destination) 
      print geneID_list 
     #break 
     if len(geneID_list) >0: 
      break     

def main(): 
    if len(sys.argv) <=1: 
     parser.print_help() 
     sys.exit() 
    else: 
     check_file_exists(opts.input_file, 'input_file') 

    destination=opts.input_file + '/rejected_database_genes' 
    if os.path.exists(destination): 
     print 'Folder already exits' 
    else: 
     os.makedirs(destination) 
     print 'Folder has been created' 
    files=glob.glob(opts.input_file+'/*.fa') 
    #print files 
    #sys.exit()  
    for f in files: 
     #print f 
     #sys.exit() 
     alleles_files=glob.glob(f)[0] 
     #print alleles_files 
     #sys.exit() 

     remove_empty_files(alleles_files,destination) 
    print 'Files have been removed' 
main() 

追加することにより第三の「if」文、ファイルであるとすぐに、それは不必要なシーケンス、先にファイルを削除して、次のファイルをチェックするために移動を見つけると削除。

0

あなたが持っている問題はshutil.moveラインである - あなたは、これは既存のファイルを上書きします、あなたは、このエラーを取得することはできません送信元と送信先のフルパスを指定する場合は、あなたが上書きしたくない場合や両方のファイルが必要です。目的のファイルの名前を変更するだけです。

+0

削除する必要がある最初のgene.seqが見つかるとすぐにファイルを移動してから、次のファイルに渡します。 – Ana

+1

だから 'shutil.move'の代わりに' os.remove'を使います – ddor254

関連する問題