关于OptionParser的使用

2018-07-11  本文已影响21人  天秤座的机器狗

在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,还是有很多功能不会,慢慢学习吧。

上一篇下一篇

猜你喜欢

热点阅读