2015-08-03 43 views
0

我有以下結構的文件:打印線

@scaffold456 
ATGTCGTGTCAGTG 
GTACGTGTGTGG 
+ 
[email protected]!!!!!!!! 
!!!!!!!!!!!! 
@scaffold342 
ATGGTGTCGTGGTG 
ACGTGGC 
+ 
!>!>!!!!+!!!!! 
!!!!!!! 

我希望像這樣的輸出:

>scaffold456 
ATGTCGTGTCAGTG 
GTACGTGTGTGG 
>scaffold342 
ATGGTGTCGTGGTG 
ACGTGGC 

我想在Python實現這一目標,我開始執行以下操作:

fastq_filename = "test_file" 
fastq = open(fastq_filename) # fastq is the file object 

for line in fastq: 
    if line.startswith("@"): 
     print line.replace("@", ">") 

,但我不能再繼續下去,因爲我不知道: 1。如何在特定模式匹配後打印行? 2.我應該如何指定我要跳過+到下一個@符號之間的行?

這是一個比較複雜的Python主題,我不知道,任何幫助和解釋都會很棒,謝謝!

+0

爲什麼不直接使用[Biopython](http://biopython.org/wiki/SeqIO)庫來爲您閱讀這些內容? – CoryKramer

+0

由於我的文件雖然是fastq格式,但不是原始讀取文件,它基本上是一個已轉換爲fastq的fasta文件,因此屬於每個序列的行數很多,看起來很亂。另外,我正在嘗試學習python,嘗試學習python是一件簡單的工作。 – Homap

回答

4
fastq_filename = "test_file" 
fastq = open(fastq_filename) # fastq is the file object  

canPrintLines = False # Boolean state variable to keep track of whether we want to be printing lines or not 
for line in fastq: 
    if line.startswith("@"): 
     canPrintLines = True # We have found an @ so we can start printing lines 
     line = line.replace("@", ">") 
    elif line.startswith("+"): 
     canPrintLines = False # We have found a + so we don't want to print anymore 

    if canPrintLines: 
     print(line) 
+0

謝謝!你能解釋一下canPrintLines變量,顯然這叫做狀態變量嗎? – Homap

+0

@ user1945881它是一個有限狀態機,在這裏有兩個狀態,所以一個簡單的布爾值就足以存儲狀態,這裏有兩個狀態,打印和不打印 – KameeCoding

+0

是的,它只是跟蹤你最後一次打到@還是一個+。如果你上一次打到+,那麼在打另一個@之前,你不想再打印更多行,所以我們將狀態設置爲false。當我們打印實際的行時,我們首先檢查狀態,如果滿足其他條件(即最後的「特殊」行以「@」而不是「+」開始),則只打印行 –

2

我不知道!可以得到多少複雜的線條。我理解您的問題,因此您希望忽略這些行內的所有+@標誌。

在這種情況下,我將引入存儲我們是否正在工作的一個有趣的線上狀態變量:

interesting_line=True 
for line in fastq: 
    if line.strip()=='+': # Here we check for the + sign. You might need to adapt the test. 
     interesting_line=False # We don't care from now on 
    if line.startswith('@'): 
     interesting_line=True 
    if interesting_line: 
     # Do what you want with your line. 

正如我所說的,你可能需要檢查,如果有可能的情況下我的簡單測試不匹配,但應該給你一個起點

0

以下的代碼

  1. 忽略行以+!
  2. >替換@如果符合@
  3. 寫入開始的所有其它線路

代碼

def format_file(path): 
    new_lines = "" 
    for line in open(path): 
     if line.startswith("@"): 
      new_lines += line.replace("@", ">") 
     elif line.startswith("+"): 
      pass 
     elif line.startswith("!"): 
      pass 
     else: 
      new_lines += line 
    print new_lines 

format_file("test_file") 
1

這是一種簡單的方法要做到這一點:

for line in fastq: 
    if line and line[0].isalpha() or line[0]== '@': 
     line = line.rstrip() 
     print line.replace("@", ">") 

輸出:

>scaffold456 
ATGTCGTGTCAGTG 
GTACGTGTGTGG 
>scaffold342 
ATGGTGTCGTGGTG 
ACGTGGC 
0

如果我解釋你的問題正確,則我認爲這是你在找什麼

for line in fastq: 
    line = line.replace('\n','') 
    n = len(line) 
    mat = re.match(r'([ATGC]){%d}' % n,line) 
    if mat: 
     print line 
    if line[0] == '@': 
     print line.replace('@','>') 

這使用Regular Expressions這是非常有用的。這表示,如果它是A,T,G, or C只在一行,然後打印該行,然後其他if語句是相同的,你有。 {%d}匹配n前一個語句的出現次數,[ATGC]。如果有多於A,T,G, or C那麼只需在方括號之間添加它們即可。

1
for line in fastq: 
    if line.startswith("@") or line.isalpha(): 
     print(line.replace("@", ">")) 

查找以@開始替換成>並打印出來就行了。 然後找到只包含字母的行然後打印該行。

+1

我認爲,對於進一步的訪問者來說,當你爲自己的內涵添加一些解釋時會更有幫助。 – reporter

+0

@reporter right2x – Zion