Frage

Ich versuche, einige Ergebnisse aus UniProt zu erhalten, die eine Protein-Datenbank (Details sind nicht wichtig). Ich versuche, ein Skript zu verwenden, die aus einer Art von ID zu einem anderen übersetzt. Ich konnte dies manuell im Browser tun, aber es könnte in Python nicht.

http://www.uniprot.org/faq/28 gibt es einige Proben Skripte. Ich versuchte, die ein Perl und es scheint zu funktionieren, so dass das Problem ist mein Python versucht. Der (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 massiv „Skala“, dass (das heißt, eine Menge Einträge im Abfragefeld verwenden)?

War es hilfreich?

Lösung

Frage # 1:

Dies kann mit Python urllib:

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()

Andere Tipps

Sie sind wahrscheinlich besser dran, das Protein Identifier Cross Reference-Service vom EBI mit einem Satz von IDs in ein anderes zu konvertieren. Es hat eine sehr gute REST-Schnittstelle.

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

Ich sollte auch erwähnen, dass UniProt hat eine sehr gute Web Service zur Verfügung. Obwohl, wenn Sie mit einfachen HTTP-Anfragen aus irgendeinem Grunde gebunden werden dann sein wahrscheinlich nicht sinnvoll.

Nehmen wir an, dass Sie Python 2.5 verwenden. Wir können verwenden httplib 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 könnten dann eine Funktion machen um die Query-String-Erstellung und Sie sollten entfernt werden.

check this out bioservices. sie Schnittstelle viele Datenbanken über Python. https://pythonhosted.org/bioservices/_modules/bioservices/uniprot.html

conda install bioservices --yes

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 gibt einen Datenrahmen mit allen Informationen zu jedem Eintrag.

Frage 2: gleiche Antwort. Dies sollte vergrößern.

Hinweis : Ich bin der Autor von Bioserviceleistungen

Es ist ein Python-Paket in Pip, die genau das tut, was Sie wollen

pip install uniprot-mapper
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top