2009-04-03 7 views
5

J'essaie d'obtenir des résultats d'UniProt, qui est une base de données de protéines (les détails ne sont pas importants). J'essaie d'utiliser un script qui traduit d'un type d'ID à l'autre. J'étais capable de le faire manuellement sur le navigateur, mais je ne pouvais pas le faire en Python.Comment puis-je parler à UniProt via HTTP en Python?

Dans , il existe quelques exemples de scripts. J'ai essayé le Perl et il semble fonctionner, donc le problème est mes tentatives de Python. Le script (travail) est:

## tool_example.pl ## 
use strict; 
use warnings; 
use LWP::UserAgent; 

my $base = 'http://www.uniprot.org'; 
my $tool = 'mapping'; 
my $params = { 
    from => 'ACC', to => 'P_REFSEQ_AC', format => 'tab', 
    query => 'P13368 P20806 Q9UM73 P97793 Q17192' 
}; 

my $agent = LWP::UserAgent->new; 
push @{$agent->requests_redirectable}, 'POST'; 
print STDERR "Submitting...\n"; 
my $response = $agent->post("$base/$tool/", $params); 

while (my $wait = $response->header('Retry-After')) { 
    print STDERR "Waiting ($wait)...\n"; 
    sleep $wait; 
    print STDERR "Checking...\n"; 
    $response = $agent->get($response->base); 
} 

$response->is_success ? 
    print $response->content : 
    die 'Failed, got ' . $response->status_line . 
    ' for ' . $response->request->uri . "\n"; 

Mes questions sont les suivantes:

1) Comment voulez-vous faire en Python?

2) Serai-je en mesure de "mettre à l'échelle" massivement (c'est-à-dire, utiliser beaucoup d'entrées dans le champ de requête)?

+0

ajouter votre code python tentative – nosklo

+0

Il était assez d'ouvrir la même adresse que je voudrais dans le navigateur, avec urllib2.urlopen. –

Répondre

8

question n ° 1:

Cela peut être fait en utilisant les urllibs de python:

import urllib, urllib2 
import time 
import sys 

query = ' '.join(sys.argv) 

# encode params as a list of 2-tuples 
params = (('from','ACC'), ('to', 'P_REFSEQ_AC'), ('format','tab'), ('query', query)) 
# url encode them 
data = urllib.urlencode(params)  
url = 'http://www.uniprot.org/mapping/' 

# fetch the data 
try: 
    foo = urllib2.urlopen(url, data) 
except urllib2.HttpError, e: 
    if e.code == 503: 
     # blah blah get the value of the header... 
     wait_time = int(e.hdrs.get('Retry-after', 0)) 
     print 'Sleeping %i seconds...' % (wait_time,) 
     time.sleep(wait_time) 
     foo = urllib2.urlopen(url, data) 


# foo is a file-like object, do with it what you will. 
foo.read() 
+0

Je crains que ça ne marche pas (même après avoir remplacé '=' par '==') ... Merci. :) –

1

Supposons que vous utilisez Python 2.5. Nous pouvons utiliser httplib pour appeler directement le site web:

import httplib, urllib 
querystring = {} 
#Build the query string here from the following keys (query, format, columns, compress, limit, offset) 
querystring["query"] = "" 
querystring["format"] = "" # one of html | tab | fasta | gff | txt | xml | rdf | rss | list 
querystring["columns"] = "" # the columns you want comma seperated 
querystring["compress"] = "" # yes or no 
## These may be optional 
querystring["limit"] = "" # I guess if you only want a few rows 
querystring["offset"] = "" # bring on paging 

##From the examples - query=organism:9606+AND+antigen&format=xml&compress=no 
##Delete the following and replace with your query 
querystring = {} 
querystring["query"] = "organism:9606 AND antigen" 
querystring["format"] = "xml" #make it human readable 
querystring["compress"] = "no" #I don't want to have to unzip 

conn = httplib.HTTPConnection("www.uniprot.org") 
conn.request("GET", "/uniprot/?"+ urllib.urlencode(querystring)) 
r1 = conn.getresponse() 
if r1.status == 200: 
    data1 = r1.read() 
    print data1 #or do something with it 

Vous pouvez ensuite faire une fonction autour de la création de la chaîne de requête et vous devriez être loin.

+1

Cela a malheureusement le même effet que mes autres tentatives - accrocher pendant quelques minutes. En outre, c'est "GET", qui à mon avis limite à la taille de l'URL seulement .. –

+0

Je pense que c'est le point de la limite et les valeurs de requête de colonnes, ne sachant pas ce que je retourne je ne peux pas donner de bonnes valeurs. Le GET limite ce que vous envoyez et non ce que vous recevez. –

1

Il est probablement préférable d'utiliser le service de référence croisée d'identificateurs de protéines de l'EBI pour convertir un ensemble d'ID en un autre. Il a une très bonne interface REST.

http://www.ebi.ac.uk/Tools/picr/

Je dois aussi mentionner que UniProt a de très bonnes webservices disponibles. Bien que si vous êtes lié à l'utilisation de requêtes http simples pour une raison quelconque, ce n'est probablement pas utile.

0

Il y a un paquet python dans pip qui fait exactement ce que vous voulez

pip install uniprot-mapper 
0

en complément de réponse O.rka:

Question 1:

from bioservices import UniProt 
u = UniProt() 
res = u.get_df("P13368 P20806 Q9UM73 P97793 Q17192".split()) 

Cela renvoie une trame de données avec toutes les informations sur chaque entrée.

Question 2: même réponse. Cela devrait augmenter.

Avertissement: Je suis l'auteur de bioservices

Questions connexes