Mis a jour le 2025-04-14, 12:10

Utilisation avec Entrez

Le module Entrez permet d'accéder aux bases du NCBI (à la fois les bases type séquences et autre, mais aussi PubMed par exemple).
Pour utiliser le module, faire : from Bio import Entrez.
Recommandations pour utiliser le module :
  • ne pas poster plus de 3 requêtes par secondes, sinon l'IP pourra être bloquée (mais bioptyhon le fait automatiquement).
  • si utilisation intensive, préférer une utilisation hors des pics d'activité (le matin et le week-end).
  • enregistrer une adresse mail et un nom d'outil de façon à pouvoir être contacté en cas de problème :
    Entrez.email = 'monAdresse@mail.com'
    Entrez.tool = 'monScript'
        
  • ce sont des documents xml qui sont renvoyés. Si une DTD manque dans Biotpyhon à la suite d'une mise à jour par exemple, la récupérer et la mettre dans ..../Bio/Entrez/DTDs/
Principe général : la plupart des requêtes récupère les infos sous forme de XML, et il y a un parseur intégré que l'on peut appeler avec Entrez.read qui transforme le xml en structure python (avec dictionnaires et listes).
Pour récupérer la liste de toutes les bases Entrez :
  • handle = Entrez.einfo(); result = Entrez.read(handle); handle.close()
  • le résultat est un dictionnaire avec une seule clef 'DbList' et comme valeur la liste de toutes les bases : ['pubmed', 'protein', 'nuccore', ...]
Pour récupérer des infos sur une base Entrez :
  • handle = Entrez.einfo(db = 'pubmed'); result = Entrez.read(handle); handle.close()
  • result contient un dictionnaire avec une clef unique DbInfo et comme valeur un dictionnaire.
  • result['DbInfo']['Count'] : le nombre d'entrées.
  • result['DbInfo']['LastUpdate'] : la dernière date de mise à jour.
  • result['DbInfo']['LastUpdate'] : la dernière date de mise à jour.
  • result['DbInfo']['FieldList'] : la liste des champs, chaque champ étant un dictionnaire avec ses propriétés.
  • [x['FullName'] for x in result['DbInfo']['FieldList']] : les noms complets des champs de la base.
  • pour avoir la liste des noms abrégés (du genre AUTH) :
    for x in result['DbInfo']['FieldList']:
        print(x['Name'] + ' : ' + x['FullName'] + ' (' + x['Description'] + ')')
        
Pour effectuer une requête :
  • handle = Entrez.esearch(db = 'pubmed', term = 'acetylcholine[TITL] AND receptor[TIAB] AND chang*[AUTH]', retmax = 10); result = Entrez.read(handle); handle.close() : effectue une requête exactement comme avec l'interface utilisateur en restreignant si nécessaire certains termes à certains champs.
  • on peut utiliser les booléens AND, OR, NOT (par défaut, c'est AND).
  • on peut utiliser la troncation de mot avec un '*'.
  • retmax : permet de limiter le résultat à un certain nombre de records. attention : par défault, il est fixé à 20 pour PubMed si non indiqué, donc l'augmenter si nécessaire.
  • le résultat est un dictionnaire contenant notamment les clefs :
    • Count : nombre d'ids existants correspondant à la requête.
    • RetMax : nombre d'ids retournés, qui peut être plus petit si limité par retmax.
    • IdList : la liste des ids des records retournés, par exemple le PMID dans le cas de PubMed.
  • attention : si il y a des caractère spéciaux dans la requête, il faut les échapper en html.
Pour récupérer un résumé de différentes entrées :
  • handle = Entrez.esummary(db = 'pubmed', id = '25632877,1322090'); result = Entrez.read(handle); handle.close()
  • on peut mettre un seul id ou plusieurs séparés par une virgule.
  • le résultat est une liste de dictionnaires avec comme clefs : Id, Title, FullJournalName, AuthorList, et beaucoup d'autres (mais pas l'abstract pour PubMed).
  • attention : si trop d'ids (plus de 200 environ), utiliser epost pour faire un POST plutôt qu'un GET.
Pour récupérer des entrées complètes, par exemple pour PubMed :
  • handle = Entrez.efetch(db = 'pubmed', id = '25632877,1322090', rettype = 'medline', retmod = 'text'); result = handle.read(); handle.close() : recupère le résultat sous forme de texte avec des champs.
  • handle = Entrez.efetch(db = 'pubmed', id = '25632877,8663316', rettype = 'abstract', retmod = 'xml'); result = Entrez.read(handle); handle.close() : récupère le résultat sous forme de xml qui est parsé :
    • une liste est récupérée et on peut itérer dessus pour récupérer certains champs :
      for res in result:
          print(res['MedlineCitation']['PMID'])
          print(res['MedlineCitation']['Article']['ArticleTitle'])
          print([x['LastName'] + ' ' + x['ForeName'] for x in
                res['MedlineCitation']['Article']['AuthorList']])
            
    • pour accéder au résumé quand il existe : res['MedlineCitation']['Article']['Abstract']['AbstractText'].
    • pour savoir comment accéder à une information, imprimer le xml pour voir sa structure et utiliser le nom des tags !
Récupération d'un grand nombre d'entrées :
  • on fait d'abord un post avec la liste des ids et on récupère en retour le cookie (sous forme d'environnement web) et un id de query :
    handle = Entrez.epost(db = 'pubmed', id = '25632877,8663316')
    result = Entrez.read(handle)
    webEnv = result['WebEnv']
    queryKey = result['QueryKey']
        
  • puis, on réutilise cet environnement pour demander les entrées correspondantes :
    handle = Entrez.efetch(db = 'pubmed', webenv = webEnv, query_key = queryKey,
                           rettype = 'abstract', retmod = 'xml')
    result = Entrez.read(handle)
    handle.close()
        

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert