Ich habe eine große ( >100 ) Liste von Zugangsnummern, die ich nachschlagen und mit Suchen in NCBI (Nukleotid) abgleichen möchte; hauptsächlich, um einen vorläufigen Organismus zu bekommen, der mit der Zugangsnummer übereinstimmt.
ex:
KJ841938.1 would match to Setoptus koraiensis
...
FJ911852.1 would match to Uncultured eukaryote
...
Ich habe nach Tools gegoogelt und diese Seite gefunden . Es ist jedoch nicht das, was ich wirklich möchte, da es meine Abfragen nicht in derselben Reihenfolge wie meine Liste auflistet, was bedeutet, dass ich nicht übereinstimmen kann.
Ich habe auch versucht, ein Skript in Biopython mit Entrez E-Tools zu schreiben, war aber aufgrund mangelnder Programmierkenntnisse erfolglos.
Hat jemand eine Möglichkeit, wie ich das angehen kann?
BEARBEITEN: Über dieses Tutorial habe ich versucht, dieses Codebeispiel zu verwenden:
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()
Aber geändert, um eine beliebige Liste anstelle von zu nehmen variable id
, wie unten:
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
Ausgabe ist:
1.69
673539906
283462561
Ich glaube jedoch nicht, dass ich den richtigen "rettype" -Parameter in der .efetch
Funktion verwende, da ich immer wieder GI-Nummern erhalte, wo ich gehofft hatte, direkt so etwas wie einen Artnamen zu erhalten. Es sei denn, ich kann dann mit diesen GI-Nummern im Stapel mit mehr Code oder einem Tool suchen, um eine geordnete Liste zu erstellen?
Nach einigen Versuchen und Irrtümern in einer interaktiven Python-Shell und einigen Überprüfungen der Dokumentation habe ich festgestellt, dass die relevanten Informationen in der genbank-formatierten Ausgabe ( rettype="gb"
) vorhanden sind und diese mit geparst werden können, Entrez.read
vorausgesetzt, sie werden im „xml“-Modus ( retmode="xml"
) zurückgegeben.
Der folgende Code scheint zu funktionieren:
#!/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))
(Sie brauchen while
hier übrigens keine Schleife: Python hat die bequemere for
Syntax, um die Elemente einer Liste zu durchlaufen.)
Ausgang:
KJ841938.1 Setoptus koraiensis
FJ911852.1 Gaeolaelaps aculeifer
Wer sich nicht mit BioPython herumschlagen möchte, kann dafür Entrez Direct wie folgt verwenden:
$ 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
mit übereinSetoptus koraiensis
, nicht mitGaeolaelaps aculeifer
. Bitte aktualisieren Sie daher Ihre Frage mit der korrekten Beispieleingabe und den erwarteten Ergebnissen.Ro Siv
bli
handle.readline()
, erhalten Sie nur die erste Zeile aus dem Datensatz im Genbank-Format. Um eine Liste aller Zeilen zu erhalten, könnten Sie verwendenhandle.readlines()
. Möglicherweise sind Sie mit diesem Ansatz irgendwo angekommen, aber es scheint, dass Biopython eine Möglichkeit bietet, die Ergebnisse bequemer zu analysieren (siehe meine Antwort).