2014-02-13 69 views
0

我正在寫一個python腳本(版本2.7),它將把指定目錄內的每個輸入文件(.nexus格式)變成.fasta格式。 Biopython模塊SeqIO.convert完全處理單個指定文件的轉換,但當我嘗試使用os.walk在目錄上自動執行進程時,我無法將每個輸入文件的路徑名正確傳遞到SeqIO.convert。我哪裏錯了?我是否需要使用os.path模塊中的join()並將完整的路徑名傳遞給SeqIO.convert?如何在目錄中的多個文件上傳遞Biopython SeqIO.convert()?

#Import modules 
    import sys 
    import re 
    import os 
    import fileinput 

    from Bio import SeqIO 

    #Specify directory of interest 
    PSGDirectory = "/Users/InputDirectory」 
    #Create a class that will run the SeqIO.convert function repeatedly 
    def process(filename): 
     count = SeqIO.convert("files", "nexus", "files.fa", "fasta", alphabet= IUPAC.ambiguous_dna) 
    #Make sure os.walk works correctly 
    for path, dirs, files in os.walk(PSGDirectory): 
     print path 
     print dirs 
     print files 

    #Now recursively do the count command on each file inside PSGDirectory 
    for files in os.walk(PSGDirectory): 
     print("Converted %i records" % count) 
     process(files)  

當我運行該腳本,我得到這個錯誤信息: Traceback (most recent call last): File "nexus_to_fasta.psg", line 45, in <module> print("Converted %i records" % count) NameError: name 'count' is not defined This conversation是非常有益的,但我不知道在哪裏插入連接()函數語句。 Here is an example of one of my nexus files 感謝您的幫助!

回答

2

有幾件事情正在進行。

首先,你的過程函數沒有返回'count'。你可能想:

def process(filename): 
    return seqIO.convert("files", "nexus", "files.fa", "fasta", alphabet=IUPAC.ambiguous_dna) 
    # assuming seqIO.convert actually returns the number you want 

而且,當你寫for files in os.walk(PSGDirectory)你在3元組os.walk的回報,而不是單個文件操作。你想這樣做(注意使用os.path.join的):

for root, dirs, files in os.walk(PSGDirectory): 
    for filename in files: 
      fullpath = os.path.join(root, filename) 
      print process(fullpath) 

更新:

所以我看着爲seqIO.convert的文檔,並期待與被稱爲:

  • in_file中 - 一個輸入手柄或文件名
  • in_format - 輸入文件格式,小寫字符串
  • out_file - 輸出手柄或文件名
  • out_format - 輸出文件格式,小寫字母串
  • 字母 - 可選字母承擔

in_file中是要轉換的文件的名稱,原來你只是打電話seqIO.convert以「文件」 。

所以你的過程中的作用或許應該是這樣的:

def process(filename): 
    return seqIO.convert(filename, "nexus", filename + '.fa', "fasta", alphabet=IUPAC.ambiguous_dna) 
+1

順便說一句,如果用法類似於SeqIO不返回任何東西(它只是轉換一個文件,也許),你可以只寫程序(FULLPATH ),同時知道len(文件)會告訴你你處理了多少文件。 – celeritas

+0

這非常有幫助!但我仍然得到這個錯誤:'回溯(最近通話最後一個): 文件「nexus_to_fasta.psg」 41行,在 印刷工藝(FULLPATH) 文件「nexus_to_fasta.psg」 35行,在過程 回報SeqIO.convert(「files」,「nexus」,「files.fa」,「fasta」,alphabet = IUPAC.ambiguous_dna) File「/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ site_packages/Bio/SeqIO/__init__.py「,第899行,轉換爲 in_handle = open(in_file,」rU「) IOError:[Errno 2]沒有這樣的文件或目錄:'files'' – PGilbert

+0

從你調用convert的方式;在查看seqIO.convert的文檔後,我更新了答案。 – celeritas

相關問題