Python 入門之文件操作(一)

上一講中我們初步認(rèn)識(shí)了python,但是留了個(gè)懸念;生物信息中第一個(gè)要掌握的基礎(chǔ)技能,沒(méi)錯(cuò),就是這一講的文件操作了。

本文就簡(jiǎn)單介紹一下,生物信息中那些基礎(chǔ)的文件讀寫,后續(xù)補(bǔ)充文件權(quán)限管理以及文件的移動(dòng)、復(fù)制等操作(先畫個(gè)餅,有空在填坑)。

文件讀寫

在日常的生物信息學(xué)分析中,我們一般都是直接面對(duì)一些文件進(jìn)行操作的,比如測(cè)序數(shù)據(jù) fastq文件,在比如比對(duì)結(jié)果bam或者sam文件,還有 gtf或者gff3格式的注釋文件甚至還有一些數(shù)據(jù)庫(kù)文件等等。

面對(duì)這些文件時(shí)候交互式編程會(huì)很力不從心,大多數(shù)情況下我們都會(huì)選擇腳本式編程。(關(guān)于交互式編程與腳本式編程的區(qū)別見(jiàn)另一篇文章,當(dāng)然現(xiàn)在還沒(méi)有寫!(lll¬ω¬))。

腳本式編程中首先遇到的就是文件的讀寫,其次是參數(shù)的傳遞。

一般的文件都可以通過(guò)open的方式打開,readline的方式進(jìn)行讀取。

# 讀文件
f = open('/path/to/file','r') # 只讀模式打開
line = f.readline() # 讀取一行
linse = f.readlines() # 讀取所有行
f.close() # 關(guān)閉打開的文件
# 寫文件
f = open('/path/to/file','w') # 寫模式打開
f.write(string) # 將 string 寫入文件中
f.close() # 關(guān)閉打開的文件

這里推薦使用with語(yǔ)句,不光可以減少代碼量,還可以處理一些異常情況:

with open('/path/to/file','r') as f:
    line = f.readline() # 讀取一行
    linse = f.readlines() # 讀取所有行

生物信息中一般主流的文件格式有fasta、fastq、sra、Genebank、gtf、gff3、sam、bam等。

fasta文件讀寫

fasta文件一般以 > 開頭,第一行一般為序列名稱,或者其他信息之類的,第二行開始為其堿基序列。如下:

# test.fa
>MSTR.8.1 gene=MSTR.8
CCACAATTAATCAGAGGTAGCGACTACCCTATTTCTTCATTTCTTATGATTCTTACTATTTAAGCACTCA
TTTTCCATACCCCCACCTTTTACTTTCCTCTATTTTCCTCTCATCGTTAACTGATTCTGTTCAAGTTATA
GGGTTGGTTCTCAATCCTTGATATGTTGCTGGAATCCCTTTGGATTCGCTAAAAGGAGGATTTCAAGGGT
TTTCCAGAGTTTCCGACATTTGATTAAGGCGATCGGTGGATTTGAACTTGATTTCGATTGTTTCACAGTA
CCACCATGTATGGGTAATCGAGGATTTTAGGGAGGAGAGATTTGAGCCTCAAGGAGGAAGATAACCAGTT
GGTATTTCATGGTAGTAGAATCTTCAGCAATTTCTAGGTATGTTTAGAGGGT
>MSTR.26.1 gene=MSTR.26
CACCAGATCAAGATGACAGTAACTACAATTTAAGCAGATCGAACAGGAAACATGTAGCCATCTTTCATGT
ATGAAAGGTCCAAATACTAGACTCTACTTGTGCATCCCTCAGACTACATTTATTTATCTTGCCGAAATGT
TAAAAATGAAGTTTCAGTTTCTCATGTAAAGTTTAGTTTCAGTTTCATTGAGATGAATCCATGGATGTAG
CTAGTCATCCATTCTCGGGAAACAACAACCACC

對(duì)于fasta文件的讀取方式,一般有以下兩種方法:

  1. 直接讀取
    將fasta文件的每一條序列以字典的形式儲(chǔ)存起來(lái),字典的鍵為fasta序列的名稱,值為其堿基序列。
#!/usr/bin/evn python
# -*- coding: UTF-8 -*-
with open("test.fa",'r') as fa:
    sequences = {}
    for line in fa:
        if line.startswith(">"):
            name = line.rstrip("\n")
            sequences[name] = ""
        else:
            sequences[name] = sequences[name] + line.rstrip("\n")
    print (sequences)

輸出如下:

{'>MSTR.26.1 gene=MSTR.26': 'CACCAGATCAAGATGACAGTAACTACAATTTAAGCAGATCGAACAGGAAACATGTAGCCATCTTTCATGTATGAAAGGTCCAAATACTAGACTCTACTTGTGCATCCCTCAGACTACATTTATTTATCTTGCCGAAATGTTAAAAATGAAGTTTCAGTTTCTCATGTAAAGTTTAGTTTCAGTTTCATTGAGATGAATCCATGGATGTAGCTAGTCATCCATTCTCGGGAAACAACAACCACC', '>MSTR.8.1 gene=MSTR.8': 'CCACAATTAATCAGAGGTAGCGACTACCCTATTTCTTCATTTCTTATGATTCTTACTATTTAAGCACTCATTTTCCATACCCCCACCTTTTACTTTCCTCTATTTTCCTCTCATCGTTAACTGATTCTGTTCAAGTTATAGGGTTGGTTCTCAATCCTTGATATGTTGCTGGAATCCCTTTGGATTCGCTAAAAGGAGGATTTCAAGGGTTTTCCAGAGTTTCCGACATTTGATTAAGGCGATCGGTGGATTTGAACTTGATTTCGATTGTTTCACAGTACCACCATGTATGGGTAATCGAGGATTTTAGGGAGGAGAGATTTGAGCCTCAAGGAGGAAGATAACCAGTTGGTATTTCATGGTAGTAGAATCTTCAGCAATTTCTAGGTATGTTTAGAGGGT'}
  1. 使用第三方模塊
    使用 Biopython SeqIO模塊,不多使用前好像需要先安裝一下,怎么安裝請(qǐng)自行g(shù)oogle。
#!/usr/bin/evn python
# -*- coding: UTF-8 -*-
from Bio import SeqIO

with open ("test.fa",'r') as fa:
    for record in SeqIO.parse(fa,'fasta'):
        print(record)

輸出如下:

ID: MSTR.8.1
Name: MSTR.8.1
Description: MSTR.8.1 gene=MSTR.8
Number of features: 0
Seq('CCACAATTAATCAGAGGTAGCGACTACCCTATTTCTTCATTTCTTATGATTCTT...GGT', SingleLetterAlphabet())
ID: MSTR.26.1
Name: MSTR.26.1
Description: MSTR.26.1 gene=MSTR.26
Number of features: 0
Seq('CACCAGATCAAGATGACAGTAACTACAATTTAAGCAGATCGAACAGGAAACATG...ACC', SingleLetterAlphabet())

正確讀取后就可以進(jìn)行其他需求的操作了。

fastq文件讀寫

fastq文件格式:,每條序列有4行,第一行一般以 @ 符號(hào)開頭,主要是測(cè)序的一些信息可以簡(jiǎn)單理解為序列名稱,第二行是其堿基序列,第三行也是名稱,一般為了節(jié)省空間就用 + 號(hào)表示,第四行是序列每個(gè)堿基的測(cè)序質(zhì)量值,與第二行的堿基一一對(duì)應(yīng)。

@FCD1VGJACXX:2:1101:5762:2000#AAGTCGCG/1
NGGGAGACCGGGGTTCGATTCCCCGACGGGTCGTATGCCGTCTTCTGCT
+
BS\ceeeegggggffgighiiiihhUegiigggeeeeddcccccccccc
@FCD1VGJACXX:2:1101:7844:2000#AAGTCGCG/1
NTGGCTTCCTAAGCCAGGGATTGTGGGTTCGTATGCCGTCTTCTGCTTG
+
BPYa^accgeeggihfhhhfhiQQQQPPPPPP^XYefgeeWaeghhgih

對(duì)于fastq文件我們大部分情況下主要考慮其堿基質(zhì)量,常規(guī)情況下,會(huì)對(duì)其序列進(jìn)行堿基統(tǒng)計(jì)、質(zhì)量統(tǒng)計(jì)等,對(duì)于fastq文件,我們同樣也有兩種方式可以進(jìn)行讀取:

1. 常規(guī)方式
#!/usr/bin/evn python
# -*- coding: UTF-8 -*-
# style 1
with open("test.fq",'r') as fq:
    lines = fq.readlines()
    head = [item[:-1] for item in lines[::4]]
    read = [item[:-1] for item in lines[1::4]]
    qual = [item[:-1] for item in lines[3::4]]
    
    sequence = dict(zip(read, qual))
    print(sequence)
    
# style 2
with open('test.fq','r') as fq:
    sequence = {}
    name = None
    for i,line in enumerate(fq):
        if i % 4 == 0:
            name = line.rstrip('\n')
        if i % 4 == 1:
            read = line.rstrip('\n')
        if i % 4 == 3:
            sequence[(name,read)] = line.rstrip('\n')
    for key in sequence:
        print (key[0],key[1],sequence[key])

輸出如下:

# style 1
{'NTGGCTTCCTAAGCCAGGGATTGTGGGTTCGTATGCCGTCTTCTGCTTG': 'BPYa^accgeeggihfhhhfhiQQQQPPPPPP^XYefgeeWaeghhgih', 'NGGGAGACCGGGGTTCGATTCCCCGACGGGTCGTATGCCGTCTTCTGCT': 'BS\\ceeeegggggffgighiiiihhUegiigggeeeeddcccccccccc'}
# style 2
('@FCD1VGJACXX:2:1101:5762:2000#AAGTCGCG/1', 'NGGGAGACCGGGGTTCGATTCCCCGACGGGTCGTATGCCGTCTTCTGCT', 'BS\\ceeeegggggffgighiiiihhUegiigggeeeeddcccccccccc')
('@FCD1VGJACXX:2:1101:7844:2000#AAGTCGCG/1', 'NTGGCTTCCTAAGCCAGGGATTGTGGGTTCGTATGCCGTCTTCTGCTTG', 'BPYa^accgeeggihfhhhfhiQQQQPPPPPP^XYefgeeWaeghhgih')
2. 第三方模塊讀取

與讀取fasta文件的模塊一樣,使用 Biopython

#!/usr/bin/evn python
# -*- coding: UTF-8 -*-
from Bio import SeqIO

with open ("test.fq",'r') as fq:
    for record in SeqIO.parse(fq,'fastq'):
        print(record)

輸出如下:

ID: FCD1VGJACXX:2:1101:5762:2000#AAGTCGCG/1
Name: FCD1VGJACXX:2:1101:5762:2000#AAGTCGCG/1
Description: FCD1VGJACXX:2:1101:5762:2000#AAGTCGCG/1
Number of features: 0
Per letter annotation for: phred_quality
Seq('NGGGAGACCGGGGTTCGATTCCCCGACGGGTCGTATGCCGTCTTCTGCT', SingleLetterAlphabet())
ID: FCD1VGJACXX:2:1101:7844:2000#AAGTCGCG/1
Name: FCD1VGJACXX:2:1101:7844:2000#AAGTCGCG/1
Description: FCD1VGJACXX:2:1101:7844:2000#AAGTCGCG/1
Number of features: 0
Per letter annotation for: phred_quality
Seq('NTGGCTTCCTAAGCCAGGGATTGTGGGTTCGTATGCCGTCTTCTGCTTG', SingleLetterAlphabet())

至于sam/bam文件的讀取,可以使用第三方模塊:pysam ,具體練習(xí)在后面遇到了在說(shuō)。

gtf及gff3注釋信息文件的讀取與一般文本文件的讀取方式一致。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容