python - 如何让 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},
}
解决方案
看起来更好的选择是只使用bibtexparser和pandas。这要简单得多!
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)
改编自这个答案。
推荐阅读
- javascript - 在对象的属性中使用“set”的好处?
- javascript - 只有在 `Promise.all` 完成后才返回响应
- nunit - 如何为使用 IOwinContext 扩展方法的代码编写单元测试
- r - 如何从数据框中查找两个日期/时间列之间的时间差
- ios - 反序列化 SIL 全局“UIEdgeInsetsZero”时遇到致命错误
- react-native - React-Native:将 react-native-linear-gradient 与 lottie 一起使用
- oracle - PL/SQL 函数中的错误 PLS-00103
- hyperledger-fabric - Hyperledger 网络存档 RuntimeException
- angular - 更新 pageIndex 时,Angular 5 Material Paginator 重置为负值
- android - Android-从Firebase实时数据库读取数据并显示在RecyclerView上