5 Stimmen

Wie kann ich über HTTP in Python mit UniProt kommunizieren?

Ich versuche, einige Ergebnisse von UniProt zu erhalten, das ist eine Protein-Datenbank (Details sind nicht wichtig). Ich versuche, ein Skript zu verwenden, das von einer Art von ID in eine andere übersetzt. Ich konnte dies manuell im Browser machen, aber nicht in Python.

In http://www.uniprot.org/faq/28 gibt es einige Beispielskripte. Ich habe das Perl-Skript ausprobiert und es scheint zu funktionieren, also liegt das Problem an meinen Python-Versuchen. Das (funktionierende) 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 "Submiting...\n";
my $response = $agent->post("$base/$tool/", $params);

while (my $wait = $response->header('Retry-After')) {
  print STDERR "Wartezeit ($wait)...\n";
  sleep $wait;
  print STDERR "Überprüfen...\n";
  $response = $agent->get($response->base);
}

$response->is_success ?
  print $response->content :
  die 'Fehlgeschlagen, erhalten ' . $response->status_line . 
    ' für ' . $response->request->uri . "\n";

Meine Fragen sind:

1) Wie würde man das in Python machen?

2) Werde ich in der Lage sein, das massiv zu "skalieren" (d.h. viele Einträge im Abfragefeld zu verwenden)?

8voto

vezult Punkte 5065

Frage #1:

Dies kann mit Pythons urllibs gemacht werden:

import urllib, urllib2
import time
import sys

query = ' '.join(sys.argv)   

# Encode params als Liste von 2-Tupeln
params = ( ('from','ACC'), ('to', 'P_REFSEQ_AC'), ('format','tab'), ('query', query))
# URL encode sie
data = urllib.urlencode(params)    
url = 'http://www.uniprot.org/mapping/'

# Daten abrufen
try:
    foo = urllib2.urlopen(url, data)
except urllib2.HttpError, e:
    if e.code == 503:
        # blah blah Wert des Headers abrufen...
        wait_time = int(e.hdrs.get('Retry-after', 0))
        print 'Schlafe %i Sekunden...' % (wait_time,)
        time.sleep(wait_time)
        foo = urllib2.urlopen(url, data)

# foo ist ein dateiähnliches Objekt, mach damit was du willst.
foo.read()

1voto

Andrew Cox Punkte 10236

Angenommen, du verwendest Python 2.5. Wir können httplib verwenden, um die Website direkt aufzurufen:

import httplib, urllib
querystring = {}
#Hier den Query-String aus den folgenden Schlüsseln (query, format, columns, compress, limit, offset) erstellen
querystring["query"] = "" 
querystring["format"] = "" # eine von html | tab | fasta | gff | txt | xml | rdf | rss | list
querystring["columns"] = "" # die gewünschten Spalten durch Kommas getrennt
querystring["compress"] = "" # ja oder nein
##Diese können optional sein
querystring["limit"] = "" # Ich nehme an, wenn du nur ein paar Zeilen willst
querystring["offset"] = "" # bringe das Paging mit 

#Aus den Beispielen - query=organism:9606+AND+antigen&format=xml&compress=no
#Löschen Sie das Folgende und ersetzen Sie es durch Ihre Abfrage
querystring = {}
querystring["query"] =  "organism:9606 AND antigen" 
querystring["format"] = "xml" #mach es menschenlesbar
querystring["compress"] = "no" #Ich möchte nicht entpacken müssen

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  #oder mach etwas damit

Dann könntest du eine Funktion erstellen, die den Query-String erstellt, und du solltest startklar sein.

1voto

niallhaslam Punkte 292

Sie sind wahrscheinlich besser dran, den Protein Identifier Cross Reference-Service von der EBI zu verwenden, um eine Gruppe von IDs in eine andere umzuwandeln. Es hat eine sehr gute REST-Schnittstelle.

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

Ich sollte auch erwähnen, dass UniProt sehr gute Webservices zur Verfügung hat. Obwohl es wahrscheinlich nicht nützlich ist, wenn Sie aus irgendeinem Grund auf einfache HTTP-Anfragen beschränkt sind.

1voto

O.rka Punkte 26775

Schau dir das an bioservices. sie interface viele Datenbanken durch Python. https://pythonhosted.org/bioservices/_modules/bioservices/uniprot.html

conda install bioservices --yes

1voto

Thomas Cokelaer Punkte 1029

Im Ergänzung zu O.rkas Antwort:

Frage 1:

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

Dies gibt ein DataFrame mit allen Informationen zu jedem Eintrag zurück.

Frage 2: selbe Antwort. Dies sollte skalierbar sein.

Haftungsausschluss: Ich bin der Autor von bioservices

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X