drugbank xml 提取药物和靶点信息——前辈改进版


声明一下原创在这里

drugbank xml解析,提取药物和靶点信息

  1. 原创是分步骤讲的,可以拜读,了解代码含义

  2. 原创文章给出了针对1个 xml 的情况和多个 xml 文件的情况。因为 drugbank 只给了我1个 xml ,因此我只对这部分代码进行改进。

入坑前建议:

  1. 这个代码提取到的是整个drugbank的所有药物的靶点。这个对于某一个科学问题来说是不必要的。比如,只研究糖尿病的药物,这个操作需要学习那么多东西,绝大多数病种,比如类风湿药物的靶点,你是用不上的。
  2. 如果只想要某个疾病的药物靶点,在indication里边输入该疾病,到相应的页面,是可以直接导出csv表格的。少走很多弯路。文章底部可以预览这套代码提取到的东西是多么的简单。

xml 文件可以通过与 drugbank官方 发邮件获取,来回几次邮件,大概的内容是,我用这个是做研究用的,不是出于商业目的,不会把这个转让给第三方,这项研究获得什么资助之类的。最后承诺不给他人,谁要用自己申请。
这个除了来回发邮件花点时间,基本官方是很支持我们的科研工作的,而且不是商业用途是免费的。


我的系统:Windows 10

我的做法是把前辈分段讲的代码粘到一个脚本里,一键运行,出现报错。再分段运行。

这是我在转换过程中遇到一些报错:

  1. 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

  1. 脚本执行过程中的报错 “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

如果哪个勤劳的小蜜蜂发明出了有表头的脚本,还能分类提取更多的信息,麻烦评论区@我一下。
明人不说暗话:我想白嫖!谢谢!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐