使用python的streamlit模块搭建一个浅显的网页版blast

分享
程序员 2024-9-17 00:13:01 54 0 来自 中国
streamlit的参考资料

https://docs.streamlit.io/library/get-started/create-an-app
st.button https://docs.streamlit.io/library/api-reference/widgets/st.button
st.text_area https://docs.streamlit.io/library/api-reference/widgets/st.text_area
python io https://docs.python.org/3/library/io.html
io.StringIO 主要作用 python subprocess 调用blastn,blastn输出效果不生存到文件里,而是输出到屏幕,输出到屏幕的内容必要用io.StringIO转化一下才能被NCBIXML分析
https://janakiev.com/blog/python-shell-commands/
这个链接主要先容的是python subprocess 调用blastn,blastn输出效果不生存到文件里,而是输出到屏幕 ,然后怎样将输出到屏幕的内容生存到一个python 对象里
https://stackabuse.com/the-python-tempfile-module/
这个链接主要先容了怎样天生临时文件(用于存储用户上传的fasta文件)
https://stackoverflow.com/questions/23212435/permission-denied-to-write-to-my-temporary-file
临时文件写入内容的时间不知道为啥总是提示没有权限,这个链接里稍微有点先容
st.datatable https://docs.streamlit.io/1.3.0/library/api-reference/data/st.dataframe
https://www.metagenomics.wiki/tools/blast/blastn-output-format-6
blastn output format 6 的表头
st.file_uploader https://docs.streamlit.io/library/api-reference/widgets/st.file_uploader
完备代码

(还很不美满,只是勉强可以运行)
import streamlit as stimport tempfileimport osimport iofrom Bio import SeqIOimport subprocessfrom Bio.Blast import NCBIXMLimport pandas as pdst.title("Learn how to build web blast app using streamlit")# abc = st.text_area(label="paste your fasta here",#              value=">seq1\nATCGA",#              height=200)# #print(abc)# if st.button('save'):#     # for line in abc:#     #     st.write(line)#     with open('abc.txt','w') as fw:#         fw.write(abc)        #     st.write("OK")# result = st.button("Click Here")# # # st.write(result)# print(os.getcwd())# if result:#     with tempfile.TemporaryFile() as fp:#         tmp = tempfile.NamedTemporaryFile(suffix=".fasta",delete=False)#         st.write(tmp.name)#         tmp.write(bytes(abc,'utf-8'))#         tmp.seek(0)#         with open(tmp.name,'r') as fr:#             for line in fr:#                 st.write(line)#         #os.write(new_file,b'abcde')#         #st.write("OK")#         #os.close(new_file)#         # with open(tmp.name,'w') as fw:#         #     fw.write(abc)#     st.write(":smile:")    # you need to change this path to you ownblastn = "D:/Biotools/blast/ncbiblast/bin/blastn"db = 'D:/Bioinformatics_Intro/streamlit/uploadfiles/blastdb/cpvirus'tempfile.tempdir = "D:/Bioinformatics_Intro/streamlit/uploadfiles/temp"fasta = st.text_area(label="you can paste your fasta here",             value=">seq1\nATCGA",             height=400)runblastn = st.button("run blastn")names = "qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore".split()if runblastn:    tmp = tempfile.NamedTemporaryFile(suffix=".fasta",delete=False)    st.write(tmp.name)        tmp.write(bytes(fasta,'utf-8'))    tmp.seek(0)    for rec in SeqIO.parse(tmp.name,'fasta'):        st.write(rec.id)            cmd = [blastn,'-db',db,'-query',tmp.name,'-evalue','0.0001','-outfmt','6']    process = subprocess.Popen(cmd,stdout=subprocess.PIPE,                               stderr=subprocess.PIPE,                               universal_newlines=True)    stdout,stderr = process.communicate()    # for record in NCBIXML.parse(io.StringIO(stdout)):    #     st.write(record.query)        df = pd.read_csv(io.StringIO(stdout),sep="\t",header=None,names=names)    st.dataframe(df)    tmp.close()    os.unlink(tmp.name)        uploaded_file = st.file_uploader("or upload your fasta file here")if uploaded_file is not None:    bytes_data = uploaded_file.getvalue()    #print(type(bytes_data))    #st.write(bytes_data)    tmp = tempfile.NamedTemporaryFile(suffix=".fasta",delete=False)    st.write(tmp.name)    try:        tmp.write(bytes_data)        tmp.seek(0)        with open(tmp.name,'r') as fr:            for line in fr:                if line.startswith(">"):                    st.write("input seq id is: %s"%(line.strip().replace(">","")))                        cmd = [blastn,'-db',db,'-query',tmp.name,'-evalue','0.0001','-outfmt','6']        process = subprocess.Popen(cmd,stdout=subprocess.PIPE,                                stderr=subprocess.PIPE,                                universal_newlines=True)        stdout,stderr = process.communicate()        # for record in NCBIXML.parse(io.StringIO(stdout)):        #     st.write(record.query)                df = pd.read_csv(io.StringIO(stdout),sep="\t",header=None,names=names)        st.dataframe(df)    finally:        tmp.close()        os.unlink(tmp.name)运行代码

streamlit run main.py怎样摆设呢?
在查资料吧
接待各人关注我的公众号
小明的数据分析条记本
小明的数据分析条记本 公众号 主要分享:1、R语言和python做数据分析和数据可视化的简朴小例子;2、园艺植物相关转录组学、基因组学、群体遗传学文献阅读条记;3、生物信息学入门学习资料及本身的学习条记!
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 04:21, Processed in 0.097263 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表