drugbank xml 提取药物和靶点信息——前辈改进版
对drugbank官方给的xml文件进行药靶提取,对前辈给出的脚本进行改进
drugbank xml 提取药物和靶点信息——前辈改进版
声明一下原创在这里:
-
原创是分步骤讲的,可以拜读,了解代码含义
-
原创文章给出了针对1个 xml 的情况和多个 xml 文件的情况。因为 drugbank 只给了我1个 xml ,因此我只对这部分代码进行改进。
入坑前建议:
- 这个代码提取到的是整个drugbank的所有药物的靶点。这个对于某一个科学问题来说是不必要的。比如,只研究糖尿病的药物,这个操作需要学习那么多东西,绝大多数病种,比如类风湿药物的靶点,你是用不上的。
- 如果只想要某个疾病的药物靶点,在indication里边输入该疾病,到相应的页面,是可以直接导出csv表格的。少走很多弯路。文章底部可以预览这套代码提取到的东西是多么的简单。
xml 文件可以通过与 drugbank官方 发邮件获取,来回几次邮件,大概的内容是,我用这个是做研究用的,不是出于商业目的,不会把这个转让给第三方,这项研究获得什么资助之类的。最后承诺不给他人,谁要用自己申请。
这个除了来回发邮件花点时间,基本官方是很支持我们的科研工作的,而且不是商业用途是免费的。
我的系统:Windows 10
我的做法是把前辈分段讲的代码粘到一个脚本里,一键运行,出现报错。再分段运行。
这是我在转换过程中遇到一些报错:
- terminal:
ERROR: Could not find a version that satisfies the requirement xmltodict (from versions: none)
ERROR: No matching distribution found for xmltodict
这个报错说的是:
安装包时出现了SSL错误。这可能是由于与PyPI(Python包索引)服务器之间的连接问题导致的
刚开始我还以为是网络卡顿,换了好几个“不能说”
后来发现,关掉了也就成功安装上了。这种靠自己家装包方式真的很爽,爽的我都不相信我自己。
Tips:在pycharm界面底端的terminal安装,不太容易产生路径错误的问题。如果是在cmd安装,就得注意路径,反而很麻烦。
安装成功的情况长这样:
Installing collected packages: xmltodict
Successfully installed xmltodict-0.13.0
terminal安装命令长这样:
pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org xmltodict
这个命令通过使用 --trusted-host 参数来信任主机,并将 pypi.org 和 files.pythonhosted.org 添加为可信主机
或者也可以用这个命令安装:
pip install --index-url https://pypi.org/simple/ xmltodict
注意,pip 是Windows的,如果是别的系统的,需要查询一下相关的命令。我也不知道,没吃过那个苦。
如果 pip 太老不能用,可以用这个命令升级:
python -m pip install --upgrade pip
- 脚本执行过程中的报错 “UnicodeDecodeError” 。
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x9e in position 10687: illegal multibyte sequence
这是代码中的do_something()函数出现了问题,导致UnicodeDecodeError错误。请确保在运行代码之前定义并实现了do_something()函数,或者将其从代码中移除以避免出现错误。
一键到底版代码
需要在 xml = open(“您的文件路径\文件名”, encoding=“utf-8”).read() 处修改文件名
例如
xml = open(“您的文件路径\\文件名”, encoding=“utf-8”).read()
xml = open(“D:\\full database.xml”, encoding=“utf-8”).read()
import json
import xmltodict
# 读取 XML 文件并转换为 JSON
xml = open("您的文件路径\\文件名", encoding="utf-8").read()
json_file = "data.json"
convertJson = xmltodict.parse(xml, encoding="utf-8")
jsonStr = json.dumps(convertJson, indent=1)
with open(json_file, 'w+', encoding="utf-8") as f:
f.write(jsonStr)
# 读取 JSON 数据
with open('data.json', 'r', encoding="utf-8") as f:
data = json.load(f)
drugs = data['drugbank']['drug']
file = open('items.csv', 'w', encoding="utf-8")
for drug in drugs:
try:
drug_id = drug['drugbank-id'][0]['#text']
except:
drug_id = drug['drugbank-id']['#text']
drug_name = drug['name']
try:
targets = drug['targets']['target']
except:
continue
drug_type = drug['@type']
if isinstance(targets, dict):
try:
uniprot_id = targets['polypeptide']['@id']
except:
continue
target_id = targets['id']
target_name = targets['name']
item = ','.join([drug_id, drug_name, drug_type, uniprot_id, target_name])
file.writelines(item + '\n')
if isinstance(targets, list):
for target in targets:
try:
uniprot_id = target['polypeptide']['@id']
except:
continue
target_id = target['id']
target_name = target['name']
item = ','.join([drug_id, drug_name, drug_type, uniprot_id, target_name])
file.writelines(item + '\n')
file.close()
这个代码执行完毕后,CSV文件应该位于Python脚本文件(main.py)相同的目录中,名为items.csv
得到的表格长这样
是的,这个脚本跑出来的 csv 表格没有表头。也可以修改代码添加表头。但是这不是还要细致研究代码么。我不想努力了扇自己两巴掌,并且下次还敢 。所以手动添加一下表头吧
DrugBank ID
Drug Name
Type
UniProt ID
Target Name
如果哪个勤劳的小蜜蜂发明出了有表头的脚本,还能分类提取更多的信息,麻烦评论区@我一下。
明人不说暗话:我想白嫖!谢谢!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)