花了一整天琢磨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:
解决方案:化合物名称有问题
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的化合物还是要靠手动检索,但是总的来说,这种半自动的方式还是大大节省了我的时间,毕竟网页一页页的点和翻也非常耗费时间。
最后,秀一下成果: