2009-04-03 13 views
5

Ich versuche, einige Ergebnisse von UniProt zu erhalten, die eine Proteindatenbank ist (Details sind nicht wichtig). Ich versuche ein Skript zu verwenden, das von einer ID zur anderen übersetzt. Ich konnte dies manuell im Browser tun, konnte es aber nicht in Python tun.Wie kann ich mit UniProt über HTTP in Python sprechen?

In http://www.uniprot.org/faq/28 gibt es einige Beispielskripte. Ich habe es mit der Perl versucht und es scheint zu funktionieren, also ist das Problem meine Python-Versuche. Die (Arbeits-) Skript ist:

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

Meine Fragen sind:

1) Wie würden Sie tun, dass in Python?

2) Kann ich das massiv "skalieren" (d. H. Viele Einträge im Abfragefeld verwenden)?

+0

fügen Sie Ihren Python Versuch Code – nosklo

+0

Es ziemlich wurde die gleiche Adresse wie ich würde im Browser zu öffnen, mit urllib2.urlopen. –

Antwort

8

Frage # 1:

Dies kann getan werden, mit urllibs 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

Ich fürchte, es funktioniert nicht (auch nachdem das '=' durch '==' ersetzt wurde) ... Danke. :) –

1

Nehmen wir an, dass Sie 2,5 Python verwenden. Wir können httplib verwenden, um direkt auf der Website aufrufen:

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 

Sie dann eine Funktion um die Erstellung der Abfrage-String machen könnte, und Sie sollten entfernt sein.

+1

Dies hat leider den gleichen Effekt wie meine anderen Versuche - Minutenlang anzuhalten. Auch, es ist "GET", die zu meinem Verständnis beschränkt es auf URL-Größe nur .. –

+0

Ich denke, das ist der Punkt der Grenze und Spalten Abfrage Werte, nicht zu wissen, was ich zurückgeben kann ich keine guten Werte für diese geben. Das GET begrenzt, was Sie senden, nicht was Sie erhalten. –

1

Sie sind wahrscheinlich besser dran mit dem Protein Identifier Cross Reference Service von der EBI, um einen Satz von IDs in einen anderen zu konvertieren. Es hat eine sehr gute REST-Schnittstelle.

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

Ich soll auch erwähnen, dass UniProt sehr guten Web Service zur Verfügung hat. Obwohl, wenn Sie mit einfachen HTTP-Anfragen aus irgendeinem Grund gebunden sind, dann ist es wahrscheinlich nicht sinnvoll.

0

Es ist ein Python-Paket in pip das ist genau das tut, was Sie

pip install uniprot-mapper 
0

in Ergänzung zu O.rka Antwort:

Frage 1:

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

Dies liefert einen Datenrahmen mit allen Informationen zu jedem Eintrag.

Frage 2: gleiche Antwort. Dies sollte größer werden.

Haftungsausschluss: Ich bin der Autor von Bioserviceleistungen