科研论文word格式参考文献自动编码脚本

发布于:2025-04-02 ⋅ 阅读:(16) ⋅ 点赞:(0)

觉得word格式论文的文献要手动编码是枯燥的工作,也用过知网研学的插件,但可能电脑问题不太好用,现在分享一个自制python脚本自动进行编码,整个流程如下:

1.首先确定好需要引文的顺序,本人一般在txt里编排,txt里的文献顺序可以使用以前分享的插件进行自动编排:

分享论文编排参考文献序号小脚本_参考文献超脚本数字-CSDN博客

譬如:

2.确定好顺序后在word中对应位置插入中括号,建议使用模板里的格式,其中[]自动填充1个号码,[2]或[3以上]则填充为[-]格式,表示多个号码,[,2]填充为[,-]格式,[.]不进行操作

脚本.py及示例word文件下载:【免费】论文word参考文献自动编码脚本及示例文件资源-CSDN文库

使用python3运行脚本(arcgis用户可以使用pro的python3),运行填上文件名

结果:

完整代码:

# -*- coding:utf-8 -*-
# ---------------------------------------------------------------------------
# Author: LGZ
# Created on:
# Reference:
# coding:cp936 or coding:utf-8
# ---------------------------------------------------------------------------

import logging, os, pprint,re
import pandas as pd
import numpy as np

# import arcpy
# arcpy.env.overwriteOutput = True
# import itertools, random, math

errfile = r"ex.txt"
loggingfile = r"lg.txt"

# logging.disable(logging.CRITICAL)  #禁用CRITICAL级别以下的日志记录
# 按此格式显示DEBUG级别以上的日志记录
# logging.basicConfig(filename=loggingfile, level=logging.DEBUG, format="%(asctime)s-%(levelname)s-%(message)s")
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s-%(levelname)s-%(message)s")


# pprint.pformat函数只能输入一个参数,logprint(*shape)中*shape为元组,将元组放进pprint.pformat
def logprint(*shape):
    return logging.debug(pprint.pformat(shape))


# file =
# if os.path.isfile(file):  # 判断文件是否已存在,已存在则删除
#     os.unlink(file)
# if os.path.dirname(file) == "" :  # 判断是否没有完整路径
#     file = os.getcwd()+"//"+file  # 如没有则连接工作目录制造完整路径
# file_list=os.listdir(file)  # 根据需要的文件类型获取目录下文件名列表
# file_list=[i for i in file_list if i.endswith("xlsx") and \
# not i.startswith("~$")]

# save_fold =
# os.makedirs(save_fold, exist_ok=True)  # 根据文件夹是否已存在制造文件夹


if __name__ == '__main__':
    """脚本单独使用时运行以下内容"""
    """----------------------------------------------"""
    """---------------------PARA---------------------"""

    try:
        logprint("start of program")
        # TODO
        from docx import Document

        # 打开文档,原文不要使用主题宋体或主题字体,否则无法修改字体样式
        path = input("请输入文件路径(含文件拓展名,同路径可只写文件名):")
        pathrip = path.strip('"')
        doc = Document(pathrip)
        # doc = Document('修改后的文档1.docx')

        # 用于记录当前的编号
        index = 1

        # []自动填充1个号码,[2]则填充为[-]格式,表示2个号码,[,2]填充为[,-]格式
        paras = doc.paragraphs
        for nopara,para in enumerate(paras):
            runs = para.runs
            # new_text = ""
            runlst = []
            lftindexlst = []
            rgtindexlst = []
            for norun,run in enumerate(runs):
                cur_text = run.text
                runlst.append(cur_text)
                if '[' in cur_text:
                    lftindexlst.append(norun)
                if ']' in cur_text:
                    rgtindexlst.append(norun)

            txtlst =[]
            for lftindex,rgtindex in zip(lftindexlst,rgtindexlst):  # (5, 6)  (91, 94)
                txtlst2 = []

                for i in range(rgtindex-lftindex):
                    txtlst2.append(runs[lftindex+i].text)
                txt = ''.join(txtlst2)+runs[rgtindex].text
                txtlst.append(txt)
            n = 0
            for lftindex,rgtindex in zip(lftindexlst,rgtindexlst):  # (5, 6)  (91, 94)

                for i in range(rgtindex-lftindex):
                    runs[lftindex + i].text = ''
                    runs[rgtindex].text = txtlst[n]
                n += 1


            for norun, run in enumerate(runs):
                cur_text = run.text
                if '[' in cur_text:
                    re_num = re.findall(r'\d+', cur_text)
                    if re_num :
                        new_num = int(re_num[0])
                        if new_num ==1:
                            run.text = re.sub(r'\d+', f'{index}',cur_text)
                        else:
                            run.text = re.sub(r'\d+', f'{index}-{index+new_num-1}', cur_text)
                        run.font.name = 'Times New Roman'
                        run.font.superscript = True
                        index += new_num
                    elif cur_text == '[]':
                        run.text = cur_text.replace(']', f'{index}]')
                        run.font.name = 'Times New Roman'
                        run.font.superscript = True
                        # runs[norun+1].font.superscript = True
                        index += 1

        doc.save('修改后的文档.docx')


        # assert a != 0, "a不能为0"
        # raise Exception("XX")

    except Exception as ex:
        # If an error occurred, print line number and error message
        import traceback
        import sys

        tb = sys.exc_info()[2]
        print(u"捕获到的异常信息是:{}".format(ex))  # 或者使用print("捕获到的异常信息是:",ex.args[0]或者str(ex)或者直接ex);3.9版本ex.message已不可用)
        print(u"捕获到的异常代码行号是:Line {0}".format(tb.tb_lineno))
        print(traceback.format_exc())  # 显示完整错误路径
        with open(errfile, "a") as err:
            err.write(traceback.format_exc())
            print(u"将traceback信息写入文件成功")
    # except arcpy.ExecuteError:
    # print(arcpy.GetMessages())

    # 无错误运行else后代码
    else:
        logprint("program success")
        # arcpy.AddMessage("program success")

    # 有没有错误均运行finally后代码
    finally:
        input("回车键退出")