如何使用Python對引數進行解析

徐洲更發表於2018-01-19

如何使用Python對引數進行解析

主要用到一個庫argparse,用ArgumentParser建立引數解析物件ArgumentParser,而用add_argument()在解析物件裡新增要解析的引數. 最後用parse_args()進行解析,返回引數所在的名稱空間。如果涉及到子命令,則還需要add_subparsers

第一步:建立ArgumentParser物件。

import argparse
parser = argparse.ArgumentParser(description=`covert all-sites vcf to fa`)

儘管還有其他許多引數,諸如prog,usage,add_abbre等,但大部分情況只需要用到description引數,用來說明這個命令列工具的用途即可。

第二步:新增需要解析的引數

parser.add_argument(`--filepath`, `-f`,nargs=1,required=True,help=`provide a vcf file path`)

這裡表明,需要提供一個檔案路徑,且是必須。

第三步:解析命令

args = parser.parse_args()

綜上,整合我已經寫了的vcf轉換成fa的程式碼,最後如下

import argparse
import re

# parse the args
parser = argparse.ArgumentParser(description=`convert all-sites vcf to fa.`)
parser.add_argument(`--filepath`,`-f`, nargs=1, required=True, help=`a vcf file path`)
args = parser.parse_args()

vcf = open(args.filepath[0])

pattern = re.compile(`.*?DP=(\d+);.*?`)
current_pos = 0
min_depth = 15
seq_arr = [i for i in range(13124)]


for line in vcf.readlines():
    cols = line.split(`	`)
    # get the current position
    current_chr = cols[0]
    pos = int(cols[1]) - 1
    # get the reference base and alternative base
    ref_base = cols[3]
    alt_base = cols[4]
    depth = int(re.findall(pattern = pattern, string= cols[7])[0])
    if depth > min_depth:
        if alt_base == `.`:
            seq_arr[pos] = ref_base
        else:
            seq_arr[pos] = ``
    else:
        seq_arr[pos] = ``

fa = ``.join(seq_arr)
vcf.close()

with open(`result.fa`,`wb`) as f:
    f.write(fa)

程式碼還有繼續的優化的餘地。不過能用就行了。


相關文章