2009-04-03 10 views
5

Estoy tratando de obtener algunos resultados de UniProt, que es una base de datos de proteínas (los detalles no son importantes). Intento usar algún script que traduzca de un tipo de ID a otro. Pude hacer esto manualmente en el navegador, pero no pude hacerlo en Python.¿Cómo puedo hablar con UniProt a través de HTTP en Python?

En http://www.uniprot.org/faq/28 hay algunos scripts de muestra. Probé el Perl y parece que funciona, así que el problema son mis intentos de Python. El guión (de trabajo) es:

## 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"; 

Mis preguntas son:

1) ¿cómo hacer que en Python?

2) ¿Seré capaz de "escalar" masivamente eso (es decir, usar muchas entradas en el campo de consulta)?

+0

añadir su código intento pitón – nosklo

+0

Se estaba abriendo más o menos la misma dirección que lo haría en el navegador, con urllib2.urlopen. –

Respuesta

8

la pregunta # 1:

Esto se puede hacer usando urllibs de pitón:

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

Me temo que no funciona (incluso después de reemplazar ese '=' por '==') ... Gracias. :) –

1

Vamos a suponer que está utilizando Python 2.5. Podemos utilizar httplib llamar directamente a la página 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 

A continuación, puede crear una función en torno a la creación de la cadena de consulta y que debe estar lejos.

+1

Desafortunadamente tiene el mismo efecto que mis otros intentos, esperar unos minutos. Además, es "OBTENER", que a mi entender lo limita al tamaño de la URL solo ... –

+0

Creo que este es el punto de los valores de consulta de límite y columnas, sin saber lo que estoy devolviendo no puedo dar buenos valores para estos. El GET limita lo que envía no lo que recibe. –

1

Probablemente sea mejor utilizar el servicio de referencia cruzada del identificador de proteínas del EBI para convertir un conjunto de identificadores a otro. Tiene una muy buena interfaz REST.

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

También debería mencionar que UniProt tiene muy buenos servicios web disponibles. Sin embargo, si está ligado al uso de solicitudes http simples por algún motivo, probablemente no sea útil.

0

Hay un paquete python en la pipa que hace exactamente lo que quiere

pip install uniprot-mapper 
0

como complemento a la respuesta O.rka:

Pregunta 1:

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

Esto devuelve una trama de datos con toda la información acerca de cada entrada.

Pregunta 2: misma respuesta. Esto debería ampliarse.

Negación: Soy el autor de bioservicios

Cuestiones relacionadas