2013-04-07 97 views
2

我想要一個包含9個文件的文件夾,每個文件包含單獨基因的FASTA記錄,並刪除重複的記錄。我想設置它,以便使用包含基因作爲第一個參數的文件夾和新文件夾名稱來調用腳本,以重寫新文件而不重複。但是,如果文件存儲在當前目錄中名爲results的文件夾中,它不會讓我打開該文件夾中的任何基因文件來處理它們的重複。我已經搜索周圍,似乎我應該能夠調用Python的open()函數的文件名的像這樣的字符串:從文件夾打開多個python文件

input_handle = open(f, "r")

該行沒有allowng我打開文件的讀取它的內容,我認爲它可能是與F的類型,這說明是類型「STR」當我打電話型(F)

另外,如果我使用完整路徑:

input_handle = open('~/Documents/Research/Scala/hiv-biojava-scala/results/rev.fa', "r")

它說沒有這樣的文件存在。我檢查了拼寫,我確信該文件確實存在。我還可以得到,如果我嘗試調用它的名字作爲一個原始字符串該文件不存在:

input_handle = open(r'~/Documents/Research/Scala/hiv-biojava-scala/results/rev.fa', "r")

或者,如果我嘗試調用它的下面它說,沒有全球性的結果存在:

input_handle = open(os.path.join(os.curdir,results/f), "r")

這是完整的代碼。如果有人知道問題是什麼,我將不勝感激任何可以提供的幫助。

#!/usr/bin/python 
import os 
import os.path 
import sys 
import re 
from Bio import SeqIO 

def processFiles(files) : 
    for f in files: 
      process(f) 

def process(f): 
    input_handle = open(f, "r") 
    records = list(SeqIO.parse(input_handle, "fasta")) 
    print records 
    i = 0 
    while i < len(records)-1: 
      temp = records[i] 
      next = records[i+1] 
      if (next.id == temp.id) : 
        print "duplicate found at " + next.id 
        if (len(next.seq) < len(temp.seq)) : 
          records.pop(i+1) 
        else : 
          records.pop(i) 
      i = i + 1 


    output_handle = open("out.fa", "w") 
    for record in records: 
      SeqIO.write(records, output_handle, "fasta") 

    input_handle.close() 



def main(): 
    input_folder = sys.argv[1] 
    out_folder = sys.argv[2] 
    if os.path.exists(out_folder): 
      print("Folder %s exists; please specify empty folder or new one" %   out_folder) 
      sys.exit(1) 
    os.makedirs(out_folder) 
    files = os.listdir(input_folder) 
    print files 
    processFiles(files)  



main() 
+0

'〜'不是一個實際的目錄。這是一個通配符,只要* shell *(不是Python,不是Python的「open」)遇到它就會擴展到您的主目錄。無論是全寫出你的主目錄,還是通過'os.path.expanduser'之類的路徑傳遞給'open'。 – jwodder 2013-04-07 00:14:38

+0

@jwodder:或者您可以使用os.environ ['HOME']來獲取主目錄。 – refi64 2013-04-07 00:57:04

+0

@ kirbyfan64sos,更簡單的是'os.path.expanduser(「〜/ foo/bar」)' – 2013-04-07 01:04:35

回答

2

嘗試input_handle = open(os.path.join(os.getcwd,results/f), "r")os.curdir返回.請參閱mail.python.org/pipermail/python-list/2012-September/631864.html。