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