使用MySQL和Python批量修改EndNote文献库

女朋友要毕业了,写毕业论文要引很多文献,有些格式调起来很繁琐。她写论文+管理文献用的是Word+EndNote,比起纯手工已经方便了很多,但仍然有些让人头疼的问题,需要耗费大量人力。如果能批量修改EndNote文献库中的内容,则可以使工作量大大降低。

探索过程

EndNote本身并不支持使用脚本等方式对文献库进行定制化的批量修改,为了实现这一目标需要小小的hack一下。搞明白前因后果以后,其实也不复杂:

  1. 第一步是找到EndNote文献库的数据存在哪里。对EndNote稍作了解即可发现,与每个EndNote库*.enl文件处于同一目录下的Data文件夹具有储存数据的重大嫌疑:
    • 在EndNote文献库中有很多文献时,该文件夹体积巨大。
    • *.enl文件不与Data同文件夹时,打开*.enl将会失去EndNote的大部分功能。
  2. Data文件夹下有若干子文件夹。如果在EndNote中保存了pdf则有pdf文件夹,除此之外还有rdbtdb两个文件夹。rdbtdb中的文件后缀名均为*.frm*.MYI*.MYD。而这些文件后缀正是MySQL的数据文件。因此不难推断EndNote将所有后台数据保存为MySQL数据库格式,对这些数据库进行增删改查即可突破EndNote本身的接口限制访问EndNote文献库。

    选择直接对EndNote的源文件进行操作而不选择导出为其它格式再操作的原因是只有这种方式才能保持文献库的结构如“组”不变。

  3. rdbtdb两个文件夹分别代表什么含义没有找到明确的文档,但是在我的case里tdb里文件体积都较小而rdb中文件体积都较大。据一些简单测试貌似rdb中是主要数据而tdb中是回收站数据。因此下面只关注rdb文件夹中的文件。tdb文件夹中的文件格式其实与rdb文件夹中相仿,因此以下方法也不难推广。
  4. rdb(代表了一个MySQL数据库)中含有若干个MySQL数据表,其中与参考文献基本信息相关的是refs.*文件。利用恢复数据库的方法,将这些文件恢复成MySQL数据库

    1. 以Ubuntu为例,在MySQL数据目录(/var/lib/mysql)中建立新数据库文件夹如endnote

      1
      mkdir /var/lib/mysql/endnote
    2. 将数据库文件(refs.frmrefs.MYIrefs.MYD)直接拷贝到该目录中,可能需要root权限:

      1
      cp refs.* /var/lib/mysql/endnote
    3. 改变文件所有者,使其所有者为mysql,这样MySQL进程才能够正常访问这些文件:

      1
      chown -R mysql:mysql /var/lib/mysql/endnote
    4. 在MySQL Shell中,给予用户修改该数据库的权限:

      1
      mysql> GRANT ALL PRIVILEGES ON endnote.refs TO 'root'@'localhost';
  5. 下面就可以像操作数据库一样操作所有EndNote文献库中的文献了,可用的方法非常多。对于这种日常使用的情形,接上Python以后就可以直接上天。因此使用Python+PyMySQL进行高效的文献批量修改。

  6. 最后再将修改后的refs文件拷贝回原位置即可。

步骤总结

  1. 利用恢复数据库的方式,将与EndNote关联的Data/rdb文件夹中的refs.*文件转为MySQL数据库
  2. 对该数据库进行批量修改
  3. 将MySQL数据库中的数据拷贝回Data/rdb文件夹

后记

  • 写论文,能用\(\LaTeX\)还是尽量用\(\LaTeX\),特别是用overleaf。参考文献用bibtexparser批处理非常方便。
  • 日常使用计算机,本质就是把人做事的复杂度从\(\mathcal{O}(N)\)或者更高变成\(\mathcal{O}(1)\)。