2017-05-31 57 views
2

我正在設計一個需要在早期階段輸入.fasta文件的代碼。現在,我使用這個功能驗證輸入:如何檢查給定文件是否爲FASTA?

def file_validation(fasta): 
    while True: 
     try: 
      file_name= str(raw_input(fasta)) 
     except IOError: 
      print("Please give the name of the fasta file that exists in the folder!") 
      continue 

     if not(file_name.endswith(".fasta")): 
      print("Please give the name of the file with the .fasta extension!") 
     else: 
      break 
    return file_name 

現在,雖然這一功能正常工作,還有一個用戶可以,雖然有潛在的可能輸入一個文件中的一些閃失中的意義以.fasta結尾的文件名可能包含一些非.fasta內容。我能做些什麼來防止這種情況,並讓用戶知道他/她的.fasta文件已損壞?

+0

寫FASTA解析器或找到一個現有的聯機。 – Kevin

+0

我知道*沒有*關於fasta我自己。但是,在https://stackoverflow.com/a/7655072/131187有一個可能對您有用的答案。我會說,試着解析幾百個字符,假設有意義。如果解析成功,則接受該文件。 –

+0

@Kevin我嘗試使用Biopython SeqIO'SeqIO.parse(file_name,'fasta'))'作爲條件樹的一部分,以查看是否可以解析。可悲的是,它不會在用戶警告該文件不是有效的.fasta文件時發揮作用。這是你的意思嗎? –

回答

4

爲什麼不僅僅將文件解析爲FASTA並查看它是否中斷?

使用biopython,它無聲地返回非FASTA文件空發生器失敗:

from Bio import SeqIO 

my_file = "example.csv" # Obviously not FASTA 

def is_fasta(filename): 
    with open(filename, "r") as handle: 
     fasta = SeqIO.parse(handle, "fasta") 
     return any(fasta) # False when `fasta` is empty, i.e. wasn't a FASTA file 

is_fasta(my_file) 
# False 
+0

我想弄清楚如何將'開放(文件名)....'的代碼部分集成到我的函數中,而且我仍然難以繼續工作。你認爲我應該讓這個獨立的函數,然後在我原來的驗證函數中調用它嗎? –

+0

這已經是一個獨立的功能,所以你應該能夠從你的驗證功能中調用它。你能澄清你的意圖嗎? –

+0

我只是想確保我的代碼沒有中斷,並且會繼續提示用戶輸入有效的答案。而你的設置最終確實奏效了!非常感謝你。 –