سؤال

أحاول الحصول على بعض النتائج من uniprot، وهي قاعدة بيانات البروتين (التفاصيل ليست مهمة). أحاول استخدام بعض النصي الذي يترجم من نوع واحد من المعرف إلى آخر. كنت قادرا على القيام بذلك يدويا على المتصفح، ولكن لا يمكن أن تفعل ذلك في بيثون.

في http://www.uniprot.org/faq/28. هناك بعض البرامج النصية عينة. جربت بيرل واحدا ويبدو أنها تعمل، وبالتالي فإن المشكلة هي محاولات بيثون. البرنامج النصي (العمل) هو:

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

أسئلتي هي:

1) كيف يمكنك أن تفعل ذلك في بيثون؟

2) هل سأكون قادرا على "مقياس" على نطاق واسع (أي استخدام الكثير من الإدخالات في حقل الاستعلام)؟

هل كانت مفيدة؟

المحلول

السؤال رقم 1:

يمكن القيام بذلك باستخدام 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()

نصائح أخرى

ربما تكون أفضل حالا باستخدام خدمة مرجع معرف البروتين من EBI لتحويل مجموعة واحدة من المعرفات إلى أخرى. لديها واجهة راحة جيدة جدا.

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

يجب أن أذكر أيضا أن UNIPROT لديها خدمة مساعدة جيدة جدا. رغم أنه إذا كنت مرتبطا باستخدام طلبات HTTP البسيطة لسبب ما، فمن المحتمل أنها ليست مفيدة.

دعونا نفترض أنك تستخدم بيثون 2.5. يمكننا ان نستخدم httpleib. لاستدعاء موقع الويب مباشرة:

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

يمكنك بعد ذلك إنشاء وظيفة حول إنشاء سلسلة الاستعلام ويجب أن تكون بعيدا.

تحقق من هذا bioservices. وبعد أنها واجهة الكثير من قواعد البيانات من خلال بيثون.https://pythonhosted.org/bioservices/_modules/bioservices/uniprot.html.

conda install bioservices --yes

في تكملة إلى O.RKA الإجابة:

السؤال رقم 1:

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

يرجع هذا dataframe مع جميع المعلومات حول كل إدخال.

السؤال 2: الإجابة نفسها. هذا يجب أن يطاق.

تنصل: أنا مؤلف Bioservices

هناك حزمة بيثون في النقطة التي تفعل بالضبط ما تريد

pip install uniprot-mapper
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top