2016-09-15 673 views
1

我對python相當陌生,而且我的python腳本(split_fasta.py)有問題。這裏是我的問題的一個例子:在python中使用變量作爲新文件的名稱的一部分

list = ["1.fasta", "2.fasta", "3.fasta"] 
for file in list: 
    contents = open(file, "r") 
    for line in contents: 
     if line[0] == ">": 
      new_file = open(file + "_chromosome.fasta", "w") 
      new_file.write(line) 

我已經離開了程序的底部部分,因爲它不需要。我的問題是,當我在同一個direcoty我的fasta123文件運行這個程序,它的偉大工程:

蟒蛇split_fasta.py * .fasta

但是,如果我在不同的目錄我希望程序輸出新文件(例如1.fasta_chromsome.fasta)到我當前的目錄中......它不會:

python /home/bin/split_fasta.py/home/data /*.fasta

這仍會在與fasta文件相同的目錄中創建新文件。在這裏,我敢肯定,問題是這一行:

new_file = open(file + "_chromosome.fasta", "w") 

因爲如果我把它改成這樣:

new_file = open("seq" + "_chromosome.fasta", "w") 

它創造了我的當前目錄下的輸出文件。

我希望這對你們中的一些人有意義,我可以得到一些建議。

+0

您應該結賬BioPython –

回答

3

您正在給出舊文件的完整路徑以及一個新名稱。所以基本上,如果file == /home/data/something.fasta,輸出文件將是file + "_chromosome.fasta"這是/home/data/something.fasta_chromosome.fasta

如果您在使用fileos.path.basename,你會得到的文件名(即在我的例子,something.fasta

從@Adam史密斯

您可以使用os.path.splitext擺脫的.fasta

basename, _ = os.path.splitext(os.path.basename(file)) 

回到代碼示例,我看到了很多不推薦用Python的東西。我會詳細介紹。

避免陰影內置名稱,如list,str,int ......它不明確,可能會導致以後出現潛在問題。

打開文件進行讀取或寫入時,應使用with語法。這是強烈建議,因爲它需要謹慎關閉文件。

with open(filename, "r") as f: 
    data = f.read() 
with open(new_filename, "w") as f: 
    f.write(data) 

如果你在你的文件中的空行,line[0] == ...將導致IndexError例外。改爲使用line.startswith(...)

最終代碼:

files = ["1.fasta", "2.fasta", "3.fasta"] 
for file in files: 
    with open(file, "r") as input: 
     for line in input: 
      if line.startswith(">"): 
       new_name = os.path.splitext(os.path.basename(file)) + "_chromosome.fasta" 
       with open(new_name, "w") as output: 
        output.write(line) 

通常,人們要是敢動我,並說 「這hugly」。不是真的 :)。縮進的級別清楚了什麼是上下文。

+0

,您可以使用'os.path.splitext'來擺脫額外的'.fasta'! 'basename,_ = os.path.splitext(os.path.basename(file))' –

+0

已添加。謝謝,我不知道這一個。值得再讀一遍'os.path' doc :) – FunkySayu

+0

這太好了!非常感謝您的幫助,絕對可以隨時編輯@FunkySayu – Ryan

相關問題