Pybtex не распознает вход в bibtex

Я создаю базу данных публикаций, которая позволяет пользователям вводить записи bibtex, которые я затем анализирую и сохраняю в БД. Прямо сейчас у меня проблемы с разбором записей bibtex. Я пытаюсь использовать Pybtex для разбора. Во-первых, я не вижу, чтобы у pybtex была опция parse(input), только опция parse_file(). Вот чем я сейчас занимаюсь:

def convert_to_modelform(bibtexb):
    parser = bibtex.Parser()
    f = open('/tmp/bibtex.bib', 'w')
    f.write(bibtexb)
    f.close
    bibdata = parser.parse_file('/tmp/bibtex.bib')
    print bibdata
    print len(bibdata.entries)
    return bibtexb

/tmp/bibtex.bib содержит содержимое:

@article{article,
  author  = {Peter Adams},
  title   = {The title of the work},
  journal = {The name of the journal},
  year    = 1993,
  number  = 2,
  pages   = {201-213},
  month   = 7,
  note    = {An optional note},
  volume  = 4
}

напечатать bibdata и print len ​​(bibdata.entries) дают мне:

BibliographyData(entries=OrderedCaseInsensitiveDict({}), preamble=[])
0

Что мне здесь не хватает?

1 ответ

Решение

Чтобы разобрать строку, используйте StringIO в сочетании с parse_stream:

import pybtex.database.input.bibtex
from StringIO import StringIO

def bibtex_string_to_data(s):
    parser = pybtex.database.input.bibtex.Parser()
    return parser.parse_stream(StringIO(s))

print bibtex_string_to_data("""
@article{article,
  author  = {Peter Adams},
  title   = {The title of the work},
  journal = {The name of the journal},
  year    = 1993,
  number  = 2,
  pages   = {201-213},
  month   = 7,
  note    = {An optional note},
  volume  = 4
}
""")

который дает (переформатирован для удобства чтения):

BibliographyData(entries=OrderedCaseInsensitiveDict({
    'article': Entry(
        'article',
        fields={
            'volume': '4',
            'title': 'The title of the work',
            'journal': 'The name of the journal',
            'number': '2',
            'month': '7',
            'note': 'An optional note',
            'year': '1993',
            'pages': '201-213'},
        persons={
            'author': [Person(u'Adams, Peter')]})
    }), preamble=[])
Другие вопросы по тегам