Question

Je suis en train d'obtenir des résultats de UniProt, qui est une base de données de protéines (détails ne sont pas importants). Je suis en train d'utiliser un script qui se traduit d'une sorte d'identité à l'autre. J'ai pu le faire manuellement sur le navigateur, mais n'a pas pu le faire en Python.

http://www.uniprot.org/faq/28 il y a un certain échantillon scripts. J'ai essayé une Perl et il semble fonctionner, de sorte que 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) Est-ce que je pourrai massivement « échelle » qui (à savoir, utiliser un grand nombre d'entrées dans le champ de requête)?

Était-ce utile?

La solution

Question n ° 1:

Cela peut être fait en utilisant urllib 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()

Autres conseils

Vous êtes probablement mieux d'utiliser la protéine Identifiant Croix du service de référence de l'EBI pour convertir un ensemble d'ID à l'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 simples http pour une raison alors il est probablement pas utile.

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.

vérifier cela bioservices. ils interfacent beaucoup de bases de données via Python. https://pythonhosted.org/bioservices/_modules/bioservices/uniprot.html

conda install bioservices --yes

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

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

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

Disclaimer : Je suis l'auteur de bioservices

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

pip install uniprot-mapper
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top