关于OptionParser的使用

在6月25号,就说到要学习OptionParser,终于在今天体验了一把,果然还是很好用的。学习它至少有两个好处,一是很酷炫,很像一个简单的工具的感觉,第二个也是比较重要的一点,就是可以将写过的脚本保存留下来,而不是写了就丢掉
我将几个脚本合并后,如下

ubuntu@VM-0-17-ubuntu:~/practice/bowtie/bowtie2-2.2.9/script$ python3 fastq_script.py --help
Usage: fastq_script.py [options]

Options:
  -h, --help            show this help message and exit
  -f file, --fastq=file
                        fastq filename
  --cut, --cut_fastq    cut fastq file
  -5 INT, --cut-5=INT   cut fastq N(N>0) bases from 5
  -3 INT, --cut-3=INT   cut fastq N(N>0) bases from 3'
  -l, --len-distr       sequence length distribution
  -r, --reverse         reverse fastq to fasta
  --gc                  count the GC percent

还是很有工具的感觉的
我合并的就是之前生信练习题中的几个脚本,我还是会继续添加的,先看看脚本内容吧,如下:

from optparse import OptionParser

import sys
args=sys.argv

def cut_fastq(filename,cut_3,cut_5):

   with open(filename) as fh:
      while True:
         line_1=fh.readline().strip("\n")
         if not line_1:
              break;
         line_2=fh.readline().strip("\n")
         line_3=fh.readline().strip("\n")
         line_4=fh.readline().strip("\n")

         print (line_1)
         print (line_2[cut_5:][:-cut_3])
         print (line_3)
         print (line_4[cut_5:][:-cut_3])
def length_distribution(filename):
    aDict={}
    with open(filename) as fh:
       while True:
          line_1=fh.readline().strip("\n")
          if not line_1:
              break;
          line_2=fh.readline().strip("\n")
          line_3=fh.readline().strip("\n")
          line_4=fh.readline().strip("\n")
       length=len(line_2)
       if length not in aDict:
            aDict[length]=1
       else:
            aDict[length]+=1
    for length,count in aDict.items():
        print(length,count)
def reverse_fastq2fasta(filename):
       with open(filename) as fh:
         while True:
            line_1=fh.readline().strip("\n")
            if not line_1:
               break;
            line_2=fh.readline().strip("\n")
            line_3=fh.readline().strip("\n")
            line_4=fh.readline().strip("\n")
            change=line_1.replace("@",">")
            print(change)
            print(line_2)
def gc_count(filename):
      with open(filename) as fh:
         G_count=0
         C_count=0
         length=0
         while True:
            line_1=fh.readline().strip("\n")
            if not line_1:
               break;
            line_2=fh.readline().strip("\n")
            line_3=fh.readline().strip("\n")
            line_4=fh.readline().strip("\n")
            G_count+=line_2.count("G")
            C_count+=line_2.count("C")
            length+=len(line_2)
         GC_percent=(G_count+C_count)*1.0/length
         print("The GC percent is {count}".format(count=GC_percent))
def main(args):
    parser=OptionParser()
    parser.add_option("-f","--fastq",dest="filename",help="fastq filename",metavar="file")
    parser.add_option("--cut","--cut_fastq",dest="cut",help="cut fastq file",action="store_true",default=False)
    parser.add_option("-5","--cut-5",dest="cut_5",type=int,help="cut fastq N(N>0) bases from 5", metavar="INT", default=0)
    parser.add_option("-3","--cut-3",dest="cut_3",type=int,help="cut fastq N(N>0) bases from 3'",metavar="INT", default=0)
    parser.add_option("-l","--len-distr",dest="len_distribution",help="sequence length distribution",action="store_true",default=False)
    parser.add_option("-r","--reverse",dest="reverse2fa",help="reverse fastq to fasta",action="store_true",default=False)
    parser.add_option("--gc",dest="gccount",help="count the GC percent",action="store_true",default=False)

    (options, args) = parser.parse_args()
    if options.filename:
       filename=options.filename
    if options.cut:
       cut_3=options.cut_3
       cut_5=options.cut_5
       cut_fastq(filename,cut_5,cut_3)
    if options.len_distribution:
       length_distribution(filename)
    if options.reverse2fa:
       reverse_fastq2fasta(filename)
    if options.gccount:
       gc_count(filename)
if __name__ == '__main__':
    main(args)

首先,前三行代码很简单,就是你要使用这个模块就要先导入吧。

from optparse import OptionParser

import sys
args=sys.argv

然后就是分别定义了4个函数,也就是之前写的4个脚本,有各自的功能。

def cut_fastq(filename,cut_3,cut_5):

   with open(filename) as fh:
      while True:
         line_1=fh.readline().strip("\n")
         if not line_1:
              break;
         line_2=fh.readline().strip("\n")
         line_3=fh.readline().strip("\n")
         line_4=fh.readline().strip("\n")

         print (line_1)
         print (line_2[cut_5:][:-cut_3])
         print (line_3)
         print (line_4[cut_5:][:-cut_3])

def length_distribution(filename):
    aDict={}
    with open(filename) as fh:
       while True:
          line_1=fh.readline().strip("\n")
          if not line_1:
              break;
          line_2=fh.readline().strip("\n")
          line_3=fh.readline().strip("\n")
          line_4=fh.readline().strip("\n")
       length=len(line_2)
       if length not in aDict:
            aDict[length]=1
       else:
            aDict[length]+=1
    for length,count in aDict.items():
        print(length,count)
def reverse_fastq2fasta(filename):
       with open(filename) as fh:
         while True:
            line_1=fh.readline().strip("\n")
            if not line_1:
               break;
            line_2=fh.readline().strip("\n")
            line_3=fh.readline().strip("\n")
            line_4=fh.readline().strip("\n")
            change=line_1.replace("@",">")
            print(change)
            print(line_2)
def gc_count(filename):
      with open(filename) as fh:
         G_count=0
         C_count=0
         length=0
         while True:
            line_1=fh.readline().strip("\n")
            if not line_1:
               break;
            line_2=fh.readline().strip("\n")
            line_3=fh.readline().strip("\n")
            line_4=fh.readline().strip("\n")
            G_count+=line_2.count("G")
            C_count+=line_2.count("C")
            length+=len(line_2)
         GC_percent=(G_count+C_count)*1.0/length
         print("The GC percent is {count}".format(count=GC_percent))

接着是定义了一个主函数(ps:好像python中没有主函数这个说法,我们这里先不管这个问题).

def main(args):
    parser=OptionParser()
    parser.add_option("-f","--fastq",dest="filename",help="fastq filename",metavar="file")
    parser.add_option("--cut","--cut_fastq",dest="cut",help="cut fastq file",action="store_true",default=False)
    parser.add_option("-5","--cut-5",dest="cut_5",type=int,help="cut fastq N(N>0) bases from 5", metavar="INT", default=0)
    parser.add_option("-3","--cut-3",dest="cut_3",type=int,help="cut fastq N(N>0) bases from 3'",metavar="INT", default=0)
    parser.add_option("-l","--len-distr",dest="len_distribution",help="sequence length distribution",action="store_true",default=False)
    parser.add_option("-r","--reverse",dest="reverse2fa",help="reverse fastq to fasta",action="store_true",default=False)
    parser.add_option("--gc",dest="gccount",help="count the GC percent",action="store_true",default=False)

    (options, args) = parser.parse_args()
    if options.filename:
       filename=options.filename
    if options.cut:
       cut_3=options.cut_3
       cut_5=options.cut_5
       cut_fastq(filename,cut_5,cut_3)
    if options.len_distribution:
       length_distribution(filename)
    if options.reverse2fa:
       reverse_fastq2fasta(filename)
    if options.gccount:
       gc_count(filename)

主函数下有许多parser.add_option(),这是用来添加参数的,也就是说之前定义的4个功能函数,都需要给它指定一个参数,parser.add_option()中,前一个或两个就是定义的参数,比如"-f","--fastq",-和--的区别在于-跟单个字母或数字,--跟多个,可以指定一个参数或两个,都可以。dest对应的是这个参数的变量,可以自己随意定义,后面调用的时候会用到。help就是解释一下这个参数对应函数的功能,default就是不改变它之前的默认值,metavar是占位字符串,用于在输出帮助信息时,代替当前命令行选项的附加参数的值进行输出,例如:"-f FILE --file FILE";这个例子中,字符串"FILE"就是metavar的值,理论上参数后需要跟一个值的时候就需要加。
好了,再往下的就是将之前参数设置时候,对应的参数的变量名和对应的函数之间连接起来。
最后的部分,应该就是解决前面提到的python中没有主函数的问题。

if __name__ == '__main__':
    main(args)

---------------------------------------------------KWM---------------------------------------
总之,应用上面的方法是可以把这个optionparser用起来的,我后面学习的时候会慢慢把自己写脚本整理起来
另外,今天总算是用了下简述的markdown,还是有很多功能不会,慢慢学习吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容