Tengo una lista grande ( >100 ) de números de acceso que quiero buscar y hacer coincidir con las búsquedas en NCBI (nucleótido); principalmente para obtener un organismo tentativo que coincida con el número de accesión.
ex:
KJ841938.1 would match to Setoptus koraiensis
...
FJ911852.1 would match to Uncultured eukaryote
...
Busqué herramientas en Google y encontré este sitio . Sin embargo, no es lo que realmente quiero ya que no enumera mis consultas en el mismo orden que mi lista, lo que significa que no puedo coincidir.
También intenté escribir un script en biopython usando las herramientas electrónicas de Entrez, pero no tuve éxito debido a la falta de habilidades de codificación.
¿Alguien tiene alguna manera de que pueda hacer esto?
EDITAR: a través de este tutorial , intenté usar este ejemplo de código:
from Bio import Entrez
Entrez.email = "Your.Name.Here@example.org"
handle = Entrez.efetch(db="nucleotide", id="AY851612", rettype="gb", retmode="text")
print(handle.readline().strip())
# expected output : LOCUS AY851612 892 bp DNA linear PLN 10-APR-2007
handle.close()
Pero modificado para tomar cualquier lista en lugar de variable id
, como se muestra a continuación:
import Bio
print (Bio.__version__)
from Bio import Entrez
import time
Entrez.email = "Your.Name.Here@example.org"
id_list = ["KJ841938.1", "FJ911852.1"] # real list is about 500 elements
x = 0
while x < len(id_list):
handle = Entrez.efetch(db="nucleotide", id=id_list[x], rettype= "uilist", retmode="text")
#print(handle.readline().strip())
print(handle.readline())
handle.close()
x = x + 1
La salida es:
1.69
673539906
283462561
Sin embargo, no creo que esté usando el parámetro "rettype" correcto en la .efetch
función, ya que sigo obteniendo números de GI, donde esperaba obtener algo como el nombre de una especie directamente. A menos que pueda buscar con estos números GI en lote con más código o una herramienta para producir una lista ordenada.
Después de algunas pruebas y errores en un shell de python interactivo y algunas comprobaciones de la documentación, descubrí que la información relevante está presente en la salida con formato genbank ( rettype="gb"
), y esto se puede analizar Entrez.read
siempre que se devuelva en modo "xml" ( retmode="xml"
).
El siguiente código que parece funcionar:
#!/usr/bin/env python3
from Bio import Entrez
Entrez.email = "Your.Name.Here@example.org"
id_list = ["KJ841938.1", "FJ911852.1"] # real list is about 500 elements
for accession in id_list:
handle = Entrez.efetch(
db="nucleotide", id=accession, rettype="gb", retmode="xml")
gb_record = Entrez.read(handle)
handle.close()
organism = gb_record[0]['GBSeq_organism']
print("{}\t{}".format(accession, organism))
(Por cierto, no necesita un while
ciclo aquí: python tiene la for
sintaxis más conveniente para recorrer los elementos de una lista).
Producción:
KJ841938.1 Setoptus koraiensis
FJ911852.1 Gaeolaelaps aculeifer
Si no quiere molestarse con BioPython, puede usar Entrez Direct para esto de la siguiente manera:
$ cat temp.txt
KJ841938.1
FJ911852.1
$ epost -db nuccore -input temp.txt \
| esummary \
| xtract -pattern DocumentSummary -element AccessionVersion,Organism
KJ841938.1 Setoptus koraiensis
FJ911852.1 Gaeolaelaps aculeifer
biogeek
biogeek
KJ841938.1
coincide conSetoptus koraiensis
, no conGaeolaelaps aculeifer
. Por lo tanto, actualice su pregunta con la entrada de muestra correcta y los resultados esperados.Ro Siv
bli
handle.readline()
, obtiene solo la primera línea del registro con formato genbank. Para obtener una lista de todas las líneas, puede usarhandle.readlines()
. Es posible que haya llegado a alguna parte con este enfoque, pero parece que Biopython proporciona una forma de analizar los resultados de manera más conveniente (vea mi respuesta).