2009-04-03 9 views
5

Tôi đang cố gắng để có được một số kết quả từ UniProt, một cơ sở dữ liệu protein (chi tiết không quan trọng). Tôi đang cố gắng sử dụng một số kịch bản dịch từ một loại ID khác. Tôi đã có thể làm điều này bằng tay trên trình duyệt, nhưng không thể làm điều đó trong Python.Tôi có thể nói chuyện với UniProt qua HTTP bằng Python bằng cách nào?

Trong http://www.uniprot.org/faq/28 có một số tập lệnh mẫu. Tôi đã thử một Perl và nó có vẻ làm việc, do đó, vấn đề là nỗ lực Python của tôi. The (làm việc) kịch bản là:

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

Câu hỏi của tôi là:

1) Làm thế nào bạn sẽ làm điều đó bằng Python?

2) Tôi có thể "mở rộng" một cách ồ ạt (tức là sử dụng nhiều mục nhập trong trường truy vấn) không?

+0

thêm python của bạn nỗ lực đang – nosklo

+0

Nó được khá nhiều mở địa chỉ giống như tôi sẽ trong trình duyệt, với urllib2.urlopen. –

Trả lời

8

câu hỏi # 1:

Điều này có thể được thực hiện bằng urllibs python của:

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

Tôi sợ nó không hoạt động (ngay cả sau khi thay thế '=' với '==') ... Cảm ơn. :) –

1

Giả sử rằng bạn đang sử dụng Python 2.5. Chúng ta có thể sử dụng httplib để gọi trực tiếp trang 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 

Sau đó, bạn có thể thực hiện một chức năng xung quanh tạo chuỗi truy vấn và bạn nên đi.

+1

Điều này không may có tác dụng tương tự như những nỗ lực khác của tôi - treo trong vài phút. Ngoài ra, đó là "GET", theo hiểu biết của tôi, nó chỉ giới hạn kích thước url .. –

+0

Tôi nghĩ đây là điểm của giá trị truy vấn giới hạn và cột, không biết tôi đang trả về cái gì. GET giới hạn những gì bạn gửi không phải những gì bạn nhận được. –

1

Có lẽ bạn nên sử dụng dịch vụ Tham chiếu chéo định danh protein từ EBI để chuyển đổi một bộ ID khác. Nó có một giao diện REST rất tốt.

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

Tôi cũng nên đề cập đến rằng UniProt có webservices rất tốt có sẵn. Mặc dù nếu bạn bị ràng buộc với việc sử dụng các yêu cầu http đơn giản vì một số lý do thì nó có thể không hữu ích.

0

Có một gói python trong pip mà thực hiện chính xác những gì bạn muốn

pip install uniprot-mapper 
0

trong bổ sung cho O.rka câu trả lời:

Câu hỏi 1:

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

này trả về một dataframe với tất cả các thông tin về mỗi mục.

Câu hỏi 2: cùng một câu trả lời. Điều này sẽ mở rộng quy mô.

Disclaimer: Tôi là tác giả của bioservices