PubChem的Python接口PubChemPy使用心得

花了一整天琢磨PubChemPy这个接口,写一下自己的使用心得:

目的:根据化合物名称批量下载化合物的smi格式

参考资料:

1. https://pubchempy.readthedocs.io/en/latest/

2. https://github.com/mcs07/PubChemPy

3. https://blog.csdn.net/u012325865/article/details/77148242
原文链接:https://blog.csdn.net/u012325865/article/details/102725120

代码1:

import pubchempy

import pandas as pd

import numpy as np

with open('D:\\data\\2019new\\Yangfan Project\\python\\code\\name2.txt','r',encoding='utf-8-sig') as file1:

    file_lines=file1.readlines()

    name_list=[]

    a=[]

    cc=[]

    d=[]

    e=[]

    f=[]

    #readlines读取的每行是字符串格式,采用以下代码将其转换成列表格式

    for i in file_lines:

        j=i.strip() #去掉每行头尾空白

        name_list.append(str(j))

    for k in name_list:

        results = pubchempy.get_compounds(k, 'name')

        for l in results:

            try:

                print('CID: {}\tName: {}\tMolfor: {}\tSmi: {}\tSyn: {}'.format(l.cid, l.iupac_name,l.molecular_formula,l.isomeric_smiles,l.synonyms))

                MFs=l.molecular_formula

                ISs=l.isomeric_smiles

                Sys=l.synonyms

                Cis=l.cid

                a.append(k)

                cc.append(MFs)

                d.append(ISs)

                e.append(Sys)

                f.append(Cis)

            except (pubchempy.BadRequestError,TimeoutError,urllib.error.URLError,ValueError):

                pass

        dataframe=pd.DataFrame({'name':a,'molecular formula':cc,'smiles':d,'synonyms':e,'cid':f})

        dataframe.to_csv ("D://tumor.csv",index=False,sep=',')

优点:自动读取化合物名称,检索,然后保存到excel。

缺点:在批量处理的时候总是卡着不动了,原因很多,最后我也没解决。代码没有什么大问题,如果读取的是唯一的CID号,应该能顺畅运行。但是,我用的是化合物名称,每次检索,名字对应的化合物数量超过5,就会卡死,timeout;另外,pubchem的服务器,不知道是我一天检索的太多,还是它本身就这样,一天总有那么2个小时响应很慢,也会报错。

遇到的问题以及对应的解决方案:

1.读取列表中的化合物名称时,['\ufeffDegalactotigonin', 'Deguelin'],第一个化合物前面出现\ufeff

解决方案:将‘with open('D:\\data\\2019new\\Yangfan Project\\python\\code\\name2.txt','r',encoding='utf-8-sig') as file1:’中的utf-8修改为utf-8-sig

2.pubchempy.BadRequestError: 'PUGREST.BadRequest'

解决方案:有些化合物涉及的实验太多了,或者某个实验化合物太多了.下载不下来网站设置30s自动断联.你可以设置一个try或者设置一个循环.下不下来的就跳过呗.然后收集失败了的cid自己上pubchem查

3.urllib.error.URLError: <urlopen error [Errno 2] No such file or directory>

解决方案:化合物名称有问题

4.根据名字进行批量检索始终存在timeout的情况,我最后也没能解决,程序能不能运行貌似还是取决于你检索的是什么化合物,难过,希望有大牛看到能不能帮忙。

代码2:

import pubchempy as pcp
results = pcp.get_compounds('Yuanhuacin', 'name')
for i in results:
    print('CID: {}\tMolfor: {}\tSmi: {}\tSyn: {}'.format(i.cid, i.molecular_formula,i.isomeric_smiles,i.synonyms))

results1 = pcp.get_compounds('Yunnanxane', 'name')
for j in results1:
    print('CID: {}\tMolfor: {}\tSmi: {}\tSyn: {}'.format(j.cid, j.molecular_formula,j.isomeric_smiles,j.synonyms))

results2 = pcp.get_compounds('''Zerumbone''', 'name')
for k in results2:
    print('CID: {}\tMolfor: {}\tSmi: {}\tSyn: {}'.format(k.cid, k.molecular_formula,k.isomeric_smiles,k.synonyms))

results3 = pcp.get_compounds('Zygadenine', 'name')
for l in results3:
    print('CID: {}\tMolfor: {}\tSmi: {}\tSyn: {}'.format(l.cid, l.molecular_formula,l.isomeric_smiles,l.synonyms))

优缺点:考虑到上面全自动一直报错,且总是卡死,半天没有进度,最后决定用这种半自动的方式,相当于找了4个人来帮忙检索。好处是,如果一个化合物超过30s不响应,就能立刻判断这个化合物名称要么检索出来的化合物太多,机器无法采集,要么就是数据库里没有,这个时候就需要你手动去检索了;我这批化合物里,大概1/3的化合物还是要靠手动检索,但是总的来说,这种半自动的方式还是大大节省了我的时间,毕竟网页一页页的点和翻也非常耗费时间。

最后,秀一下成果:

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值