首页 > 解决方案 > 如何让 pybtex 将缺少的字段读取为 NULL 而不是跳过记录?

问题描述

我一直在使用 pybtex (使用 this 的修改版本将记录从 .bib 文件传递​​到 .csv 像这样

from pybtex.database.input import bibtex
import csv

parser = bibtex.Parser()
bibdata = parser.parse_file("../../bib/small.bib")
 
# create csv file 
with open('smallbib.csv', mode ='w') as csv_file:
    fieldnames = ['DOI',
                  'number']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames, lineterminator = '\n')
    writer.writeheader()
    for bib_id in bibdata.entries:
        b = bibdata.entries[bib_id].fields
        try:
            writer.writerow({'DOI': b['DOI'], 
                             'number': b["number"],})
        except(KeyError):
            continue

但是,如果 .bib 文件中不存在某个字段,则此脚本会简单地忽略整个记录。如何让我的脚本改为写入 NULL 或空白单元格?跟我的说法有关系except(KeyError)吗?

样本输入数据

@Article{adeniran2016n,
  number    = {3},
  doi       = {10.1021/acs.chemmater.5b05020},
}

@Article{blankenship2017cigarette,
  doi       = {10.1039/C7EE02616A},
}

标签: pythonbibtex

解决方案


看起来更好的选择是只使用bibtexparserpandas。这要简单得多!

import bibtexparser
import pandas as pd

with open("../../bib/small.bib") as bibtex_file:
    bib_database = bibtexparser.load(bibtex_file)
    
df = pd.DataFrame(bib_database.entries)
selection = df[['doi', 'number']]
selection.to_csv('temp3.csv', index=False)

改编自这个答案


推荐阅读