1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
#!/usr/bin/env python3
import sys
import time
from Bio import Entrez
DEBUG = True
Entrez.email = "jonathan.demasi@colorado.edu"
# We should apply for an API key so we get more queries/sec
Entrez.api_key = None
def get_complete_rsids():
rsidlist = []
numresults = 0
retstart = 0
search_string = "snp_pubmed_cited[sb]"
search_results = Entrez.read(Entrez.esearch(db="snp", term=search_string,
retmax=100000, retstart=retstart, usehistory="y"))
print("Found a total of " +
search_results["Count"] + " results using search string '" + search_string + "'")
numresults = search_results["Count"]
rsidlist = rsidlist + search_results["IdList"]
additional_queries = int(int(numresults) / 100000)
while additional_queries != 0:
retstart = retstart + 100000
search_results = Entrez.read(Entrez.esearch(db="snp", term=search_string,
retmax=100000, retstart=retstart, usehistory="y"))
rsidlist = rsidlist + search_results["IdList"]
additional_queries = additional_queries - 1
return(rsidlist)
def get_pmids(interm):
# This is obsolete now, essentially, but
# allows a user to pass a single string
# which can be nice.
if isinstance(interm, str):
interm = "rs" + interm + " AND pubmed_snp_cited[sb]"
search_results = Entrez.read(Entrez.esearch(db="pubmed", term=interm,
retmax=100000,
usehistory="y"))
print("Found a total of " +
search_results["Count"] + " results using search string '" + interm + "'")
return search_results
elif isinstance(interm, list):
searchstring = " OR ".join(interm)
searchstring = "(" + searchstring + ") AND pubmed_snp_cited[sb]"
search_results = Entrez.read(Entrez.esearch(db="pubmed",
term=searchstring,
retmax=100000,
usehistory="y"))
print("Found a total of " +
search_results["Count"] + " results using search string'" + searchstring + "'")
return(search_results)
"""
Takes the saved list of results from get_pmids and retrieves
the raw XML to parse. Currently goes article by article instead of
doing them in bulk. Could go either way. Unsure which way
is better / more efficient.
"""
def get_abstracts(results):
abstracts_list = []
for start in range(0, int(results["Count"]), 1):
end = min(int(results["Count"]), start + 1)
# print("Going to download record %i to %i" % (start+1, end))
fetch_handle = Entrez.efetch(db="pubmed", rettype="abstract",
retmode="xml", retstart=start,
retmax=1,
webenv=results["WebEnv"],
query_key=results["QueryKey"])
data = fetch_handle.read()
fetch_handle.close()
root = ET.fromstring(data)
for abst in root.iter('Abstract'):
for sec in abst.iter('AbstractText'):
abstracts_list.append(sec.text)
return(abstracts_list)
def get_abstracts_from_list(pmids_list):
abstracts_list = []
pmids_abstracts_dict = {}
for each_pmid in pmids_list:
fetch_handle = Entrez.efetch(db="pubmed", id=each_pmid, retmode='xml')
data = fetch_handle.read()
fetch_handle.close()
root = ET.fromstring(data)
for abst in root.iter('Abstract'):
for sec in abst.iter('AbstractText'):
abstracts_list.append(sec.text)
return(abstracts_list)
def main():
rsids = get_complete_rsids()
if DEBUG:
for x in rsids:
print(x)
for x in rsids:
get_pmids(x)
time.sleep(0.5)
return()
if __name__ == '__main__':
main()
|