首页 > 其他分享 >使用pybtex库对bib格式的参考文献自动生成期刊格式

使用pybtex库对bib格式的参考文献自动生成期刊格式

时间:2024-10-14 09:59:12浏览次数:1  
标签:index 库对 return bibInfo bib names entry 格式

 

参考了这篇帖子:用Python代码自动生成文献的IEEE引用格式_如何修改bibtex参考文献的格式为ieee的样式-CSDN博客

 

不过直接用pybtex库就行,直接对bib文件进行提取就行了。目前是针对IEEE期刊格式,当然也可以根据其他期刊进行修改。

 

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import re
from pybtex.database import parse_file

def getIeeeJournalFormat(bibInfo):
    """
    生成期刊文献的IEEE引用格式:{作者}, "{文章标题}," {期刊名称}, vol. {卷数}, no. {编号}, pp. {页码}, {年份}.
    :return: {author}, "{title}," {journal}, vol. {volume}, no. {number}, pp. {pages}, {year}.
    """
    # 避免字典出现null值
    if "volume" not in bibInfo:
        bibInfo["volume"] = "null"
    if "number" not in bibInfo:
        bibInfo["number"] = "null"
    if "pages" not in bibInfo:
        bibInfo["pages"] = "null"

    journalFormat = bibInfo["author"] + \
                    ", \"" + bibInfo["title"] + \
                    ",\" " + bibInfo["journal"] + \
                    ", vol. " + bibInfo["volume"] + \
                    ", no. " + bibInfo["number"] + \
                    ", pp. " + bibInfo["pages"] + \
                    ", " + bibInfo["year"] + "."

    # 对格式进行调整,去掉没有的信息,调整页码格式
    journalFormatNormal = journalFormat.replace(", vol. null", "")
    journalFormatNormal = journalFormatNormal.replace(", no. null", "")
    journalFormatNormal = journalFormatNormal.replace(", pp. null", "")
    journalFormatNormal = journalFormatNormal.replace("--", "-")
    return journalFormatNormal


def getIeeeConferenceFormat(bibInfo):
    """
    生成会议文献的IEEE引用格式:{作者}, "{文章标题}, " in {会议名称}, {年份}, pp. {页码}.
    :return: {author}, "{title}, " in {booktitle}, {year}, pp. {pages}.
    """
    conferenceFormat = bibInfo["author"] + \
                       ",\"" + bibInfo["title"] + ",\" " + \
                       "in " + bibInfo["booktitle"] + \
                       ", " + bibInfo["year"] + \
                       ", pp. " + bibInfo["pages"] + "."

    # 对格式进行调整,,调整页码格式
    conferenceFormatNormal = conferenceFormat.replace("--", "-")
    return conferenceFormatNormal


def getIeeeFormat(bibInfo):
    """
    本函数用于根据文献类型调用相应函数来输出ieee文献引用格式
    :param bibInfo: 提取出的BibTeX引用信息
    :return: ieee引用格式
    """
    if "journal" in bibInfo:  # 期刊论文
        return getIeeeJournalFormat(bibInfo)
    elif "booktitle" in bibInfo:  # 会议论文
        return getIeeeConferenceFormat(bibInfo)

# 查找名,并按格式进行缩写
def capitalLetter(name):
    resName = ''
    for i in name:
        if i.isupper():
            resName += i + '. '

    return resName

# 按照bib格式,调整作者的姓名缩写形式
def nameModefy(name):
    nameList = name.split(' and ')
    resNames = []
    for index in range(len(nameList)):
        if index > 1:
            break
        names = nameList[index].split(',')
        if len(names) < 2:
            continue

        for i in range(len(names)):
            names[i] = names[i].strip()

        resName = capitalLetter(names[1]) + names[0]
        resNames.append(resName)

    result = ' and '.join(resNames)

    if len(nameList) > 2:
        result += ', et al.'

    return result


def inforDir(bibtex):
    # pattern = "[\w]+={[^{}]+}"   用正则表达式匹配符合 ...={...} 的字符串
    pattern1 = "[\w]+="  # 用正则表达式匹配符合 ...= 的字符串
    pattern2 = "{[^{}]+}"  # 用正则表达式匹配符合 内层{...} 的字符串

    # 找到所有的...=,并去除=号
    result1 = re.findall(pattern1, bibtex)
    for index in range(len(result1)):
        result1[index] = re.sub('=', '', result1[index])
    # 找到所有的{...},并去除{和}号
    result2 = re.findall(pattern2, bibtex)
    for index in range(len(result2)):
        result2[index] = re.sub('\{', '', result2[index])
        result2[index] = re.sub('\}', '', result2[index])

    # 创建BibTeX引用字典,归档所有有效信息
    infordir = {}
    for index in range(len(result1)):
        if result1[index] == 'author':
            infordir[result1[index]] = nameModefy(result2[index])
        else:
            infordir[result1[index]] = result2[index]
    return infordir


def inputBibTex():
    """
    在这里输入BibTeX格式的文献引用信息
    :return:提取出的BibTeX引用信息
    """
    bibtex = []

    print("请输入BibTeX格式的文献引用:")
    i = 0
    while i < 15:  # 观察可知BibTeX格式的文献引用不会多于15行
        lines = input()
        if len(lines) == 0:  # 如果输入空行,则说明引用内容已经输入完毕
            break
        else:
            bibtex.append(lines)
        i += 1
    return inforDir("".join(bibtex))


if __name__ == '__main__':
    refs=[]

    # 读取 BibTeX 文件
    bib_data = parse_file('myrefs.bib')

    # 初始化一个空列表
    formatted_articles = []

    refers_type=['article','book']
    # 遍历条目并提取 @article 类型的条目
    for entry_key, entry in bib_data.entries.items():
        if entry.type in  refers_type:
            # 提取作者
            authors = [f"{author.first_names[0][0]}. {author.last_names[0]}" for author in entry.persons['author']]
            authors_str = ', '.join(authors[:-1]) + ', and ' + authors[-1] if len(authors) > 1 else authors[0]

            # 提取其他字段并进行检查
            title = entry.fields.get('title', 'N/A')
            journal = entry.fields.get('journal', 'N/A')
            volume = entry.fields.get('volume', 'N/A')
            number = entry.fields.get('number', 'N/A')
            pages = entry.fields.get('pages', 'N/A')
            year = entry.fields.get('year', 'N/A')

            # 格式化字符串
            formatted_entry = f"{authors_str}, “{title},” {journal}, vol. {volume}, no. {number}, pp. {pages}, {year}."
            formatted_articles.append(formatted_entry)

    # 打印结果
    for ref in formatted_articles:
        print(ref)

    with open('formatted_articles.txt', 'w', encoding='utf-8') as f:
        f.writelines(f"{line}\n" for line in formatted_articles)
        # f.writelines(formatted_articles)

    # bibInfo = inputBibTex()  # 获得BibTeX格式的文献引用
    # print(getIeeeFormat(bibInfo))  # 输出ieee格式

 

标签:index,库对,return,bibInfo,bib,names,entry,格式
From: https://www.cnblogs.com/dogingate/p/18463500

相关文章

  • xml转YOLO的txt格式(一次必成版!)
    废话少说,直接上干货!首先,我先介绍一下代码的使用,编程语言为“Python”,共有三处需按照自己的需求修改的,我都放在代码最下面了。xml_root_path:输入你的xml格式的文件存放位置,建议全部用绝对路径txt_save_path:输入你的txt格式的文件导出后的存放位置classes_path:输入你的label......
  • 有声文件格式
    有声文件(音频文件)是用于存储声音的数字文件,常见的音频文件格式有许多种,每种格式都有其特点和适用场景。以下是一些常见的音频文件格式:1.MP3(MPEGAudioLayerIII)常见且广泛使用的压缩音频格式,适合音乐和播客。音质良好,文件体积小。2.WAV(WaveformAudioFileFormat)无损音......
  • golang从http请求中读取xml格式的body,并转成json
    推荐学习文档golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔记专栏文章目录以下是在Go语言中从HTT......
  • 在 LaTeX 中,默认的 `enumerate` 环境会输出 “1. 2. 3.“ 这样的编号。如果你想将编号
    在LaTeX中,默认的enumerate环境会输出“1.2.3.”这样的编号。如果你想将编号格式改为(1)(2)(3)这种样式,你可以通过enumerate包进行自定义。在导言区导入enumerate包:\usepackage{enumerate}在enumerate环境中使用\renewcommand来自定义编号格式为带括号的样式......
  • 硬盘格式化后能恢复数据吗?好用4款工具集锦
    嘿,硬盘格式化后能恢复数据吗?咱们现在的生活,数据可是宝贝,这大家都清楚。学习用的资料、工作的文件,还有那些宝贵的照片、视频,统统都存硬盘里。万一硬盘不小心被格式化了,那感觉就像所有东西一瞬间全没了,挺让人着急的。但别担心,现在科技这么发达,数据恢复也不是什么难事。今儿我就给......
  • IDEA中git提交前如何关闭code analysis以及开启格式化代码
    前言我们在使用IDEA开发时,经常是和GIT一起来使用的,可以说,IDEA和GIT结合的非常好,是深度绑定的,使用起来非常方便。今天,介绍一下IDEA在提交代码前的一些设置。我们是不是经常遇到一个问题,那就是我们在执行commit和push的时候,IDEA默认会执行代码检查,这是保证我们的代码基本没有......
  • IDEA中git提交前如何关闭code analysis以及开启格式化代码
    前言我们在使用IDEA开发时,经常是和GIT一起来使用的,可以说,IDEA和GIT结合的非常好,是深度绑定的,使用起来非常方便。今天,介绍一下IDEA在提交代码前的一些设置。我们是不是经常遇到一个问题,那就是我们在执行commit和push的时候,IDEA默认会执行代码检查,这是保证我们的代码基本没有问......
  • Python字符串格式
    文章目录1.数字与ASCII码转换2.字符串输出格式(%)2.1数字进制与小数表示2.2字符串长度与对齐方式3.字符串输出格式(f'')4.字符串输出格式(format)5.转义字符(换行、Tab)6.字符串查找统计替换等1.数字与ASCII码转换将ASCII码转化为数字或者将数字转化为ASCII码时,......
  • 读取bdict格式文件并转化为txt
    bdict格式是百度输入法的词库文件,那么怎么看里面的内容呢?这就需要用到bdict到txt的转化。下载:百度输入法-词库列表-餐饮比如下载“菜名大全”文件名:dict_file_734_20111227170031_1.0.0.bdict文件大小134924字节转换代码参考这篇文档:【搜狗&百度词库】.bdict文件与.sce......
  • VGG论文学习笔记(markdown格式)
    vocabback-propagation反向传播weightdecay权重衰减gradientdescent梯度下降regularisedbyweightdecay权重衰减正则化dropoutratio率conjecture猜想implicitregularisation隐式正则化circumvent规避wesampledtheweightsfromanormaldistributionwitht......