美文网首页
关于OptionParser的使用

关于OptionParser的使用

作者: 天秤座的机器狗 | 来源:发表于2018-07-11 21:53 被阅读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,还是有很多功能不会,慢慢学习吧。

    相关文章

      网友评论

          本文标题:关于OptionParser的使用

          本文链接:https://www.haomeiwen.com/subject/jlpkpftx.html