6

Pubmed からいくつかの xml をダウンロードしようとしています - 問題ありません。Biopython は素晴らしいです。問題は、出力の操作方法がよくわからないことです。解析された xml のほとんどを sql データベースに入れたいのですが、出力に慣れていません。解析された xml を辞書のように呼び出すことができるものもありますが、それほど単純ではないように見えるものもあります。

from Bio import Entrez
Entrez.email="xxxxxxxxxxxxx@gmail.com"
import sqlite3 as lite
handle=Entrez.efetch(db='pubmed',id='22737229', retmode='xml')
record = Entrez.read(handle)

タイトルを見つけたい場合は、次のようにします。

title=record[0]['MedlineCitation']['Article']['ArticleTitle']

しかし、解析されたオブジェクトの型はクラスです:

>>> type(record)
<class 'Bio.Entrez.Parser.ListElement'>
>>>r=record[0]
>>>type(r)
<class 'Bio.Entrez.Parser.DictionaryElement'>
>>> r.keys()
[u'MedlineCitation', u'PubmedData']

これは、辞書として使用するよりもはるかに簡単な方法があるに違いないと思います。しかし、私がしようとすると:

>>> r.MedlineCitation

Traceback (most recent call last):
  File "<pyshell#67>", line 1, in <module>
    r.MedlineCitation
AttributeError: 'DictionaryElement' object has no attribute 'MedlineCitation'

うまくいきません。もちろん辞書としては使えますが、後で問題が発生します。

本当の問題は、レコードを辞書のように使用するときに、レコードから特定の情報を取得しようとすることです。

>>> record[0]['MedlineCitation']['PMID']
StringElement('22737229', attributes={u'Version': u'1'})

つまり、単純に (これは専門用語です;) SQL データベースに変換することはできませんが、変換する必要があります。

>>> t=record[0]['MedlineCitation']['PMID']
>>> t
StringElement('22737229', attributes={u'Version': u'1'})
>>> int(t)
22737229
>>> str(t)
'22737229'

全体として、Entrez.read() が提供する詳細な情報には満足していますが、結果のクラス インスタンスで情報を簡単に使用する方法がわかりません。通常、次のようなことができます

record.MedlineCitation

しかし、うまくいきません。

乾杯

ウィートン

4

2 に答える 2

4

このメソッドは、とEntrez.read()で構成されるネストされたデータ構造を返します。詳細については、biopython ソースのメソッドのドキュメントを参照してください。これを抜粋して以下に言い換えます。ListElementDictionaryElementread

def read(handle, validate=True):

This function parses an XML file created by NCBI's Entrez Utilities,
returning a multilevel data structure of Python lists and dictionaries.
...
the[se] data structure[s] seem to consist of generic Python lists,
dictionaries, strings, and so on, [but] each of these is actually a class
derived from the base type. This allows us to store the attributes
(if any) of each element in a dictionary my_element.attributes, and
the tag name in my_element.tag.

パッケージの作成者であるMichiel de HoonParser.pyも、ソース ファイルの最上部で、カスタムs およびs inを使用して XML ドキュメントを表現する動機ListElementDictionaryElementEntrezについて議論しています。

ListElement非常に興味がある場合は、ソース内の、DictionaryElement、およびStructureElementクラスの魅力的な宣言を読むこともできます。驚きを台無しにして、それらが基本的な Python データ型の非常に軽いラッパーでattributesあり、XML 属性 (キーおよび値) を、read解析中のドキュメント内の各 XML ノードに対して。

したがって、質問に対する基本的な答えは、ドット演算子構文を使用して a のキーに対処する「簡単な」方法はないということDictionaryElementです。次のような辞書要素 d がある場合:

>>> d
DictElement({'first_name': 'Russell', 'last_name': 'Jones'}, attributes={'occupation': 'entertainer'})

を読み取ることができる組み込みの唯一の方法first_nameは、通常の python 辞書 API を使用することです。たとえば、次のようになります。

>>> d['first_name']
'Russell'
>>> d.get('first_name')
'Russell'
>>> d.get('middle_name', 'No Middle Name')
'No Middle Name'

がっかりしないでください、これは本当に悪いことではありません。特定のノードを取り、それを sqlite データベースの行に挿入したい場合は、DictElement を入力として取り、sqlite が出力として受け入れることができる何かを返す小さなメソッドを書くだけです。これに問題がある場合は、それについて具体的に別の質問を投稿してください。

于 2012-07-04T16:46:45.137 に答える
1

これが正しいかどうかはわかりませんが、「レコード」は辞書のリストだと思います。したがって、ループを使用して各辞書を取得する必要があります

何かのようなもの

for r in record:
    r['MedlineCitation']
于 2012-07-04T04:16:27.303 に答える