Python→ Bookmark

遍历指定文件夹中的PDF文件,从文件名中提取书名信息,然后生成符合NoteExpress导入格式的文本文件。

代码如下:

python 复制代码
import os
import re

# ============================================
# 配置区域 - 请根据你的实际情况修改
# ============================================

# PDF文件所在的文件夹路径
folder_path = r"D:\BaiduNetdiskDownload\战史丛书102卷"

# 输出文件路径
output_path = r"D:\BaiduNetdiskDownload\BookEndnote.txt"

# ============================================
# 主程序
# ============================================

def extract_info(filename):
    """
    从PDF文件名中提取卷数信息和书名
    文件名格式示例:戦史叢書第073巻 関東軍<2>関特演・終戦時の対ソ戦.pdf

    返回: (卷数信息, 书名)
    """
    # 去掉.pdf后缀
    name_without_ext = os.path.splitext(filename)[0]

    # 提取卷数:匹配 "戦史叢書第XXX巻"
    volume_match = re.search(r'(戦史叢書第\d+巻)', name_without_ext)
    volume = volume_match.group(1) if volume_match else ""

    # 提取书名:去掉卷数部分和前面的空格/全角空格
    book_title = re.sub(r'戦史叢書第\d+巻\s*[ \s]*', '', name_without_ext).strip()

    return volume, book_title


def main():
    # 检查文件夹是否存在
    if not os.path.exists(folder_path):
        print(f"错误:文件夹不存在 - {folder_path}")
        print("请检查路径是否正确!")
        return

    # 存储所有记录
    records = []

    # 获取所有PDF文件并排序
    pdf_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.pdf')]
    pdf_files.sort()  # 按文件名排序(保持卷数顺序)

    print(f"找到 {len(pdf_files)} 个PDF文件")
    print("=" * 60)

    # 遍历所有PDF文件
    for idx, filename in enumerate(pdf_files, 1):
        volume, book_title = extract_info(filename)

        # 生成NoteExpress兼容格式的记录
        # NoteExpress支持的字段标签:
        # %0 文献类型 (Book/书籍)
        # %A 作者
        # %T 标题(完整书名含卷数)
        # %B 副标题/丛书名
        # %I 出版社
        # %D 年份
        # %V 卷号
        # %N 期号
        # %P 页数
        # %X 摘要
        # %@ ISBN
        # %U URL
        # %K 关键词

        # 标题格式:戦史叢書第073巻 関東軍<2>関特演・終戦時の対ソ戦
        full_title = f"{volume} {book_title}" if volume else book_title

        record = f"""%0 Book
%A 防衛庁防衛研修所戦史室
%T {book_title}
%B 戦史叢書
%V {volume.replace('戦史叢書', '')}
%I 朝雲新聞社
%C 東京
%D 1980
%K 日本战史,防卫厅,战史丛书,太平洋战争
"""
        records.append(record)

        # 显示进度
        if idx <= 5 or idx == len(pdf_files):
            print(f"[{idx:03d}/{len(pdf_files)}] {full_title}")
        elif idx == 6:
            print("...")

    # 将所有记录写入文件(NoteExpress推荐使用UTF-8编码)
    with open(output_path, 'w', encoding='utf-8') as f:
        f.write('\n'.join(records))

    print("=" * 60)
    print(f"✅ 成功生成 {len(records)} 条记录")
    print(f"📄 文件已保存至: {output_path}")
    print("\n💡 导入NoteExpress步骤:")
    print("   1. 打开 NoteExpress")
    print("   2. 点击【文件】→【导入题录】")
    print("   3. 选择生成的 BookEndnote.txt 文件")
    print("   4. 过滤器选择 'NoteExpress' 格式")
    print("   5. 指定目标文件夹,点击【开始导入】")
    print("\n📋 生成的字段说明:")
    print("   %T 标题:包含完整卷数和书名(如:戦史叢書第073巻 関東軍<2>...)")
    print("   %B 丛书名:戦史叢書")
    print("   %V 卷号:纯数字(如:073)")
    print("   %A 作者:防衛庁防衛研修所戦史室")
    print("   %I 出版社:朝雲新聞社")
    print("   %D 年份:1966-1980(丛书出版年代)")


if __name__ == "__main__":
    main()

即可完成。

相关推荐
Patrick在香港3 小时前
Claude Prompt 香港场景:公文里「今日」落在 6 个日历日上,「翌日」锚错了 5 天
python·自然语言处理·正则表达式·claude·数据清洗
YsyaaabB3 小时前
Python 数值分析
python
阿洛学长3 小时前
计算机二级 Python 基本操作题(15 分)真题笔记(0101 ~ 1903 全套)
python·pycharm
君顾13 小时前
上海24小时自助健身房系统开发实战指南:从架构设计到落地部署
java·开发语言·健身房
weixin199701080164 小时前
[特殊字符]️《二手ERP对接电商平台的总体方案:统一数据模型 + 事件驱动 + 灰度上线6原则》(附Python源码)
大数据·python
香菜TTT4 小时前
大模型上下文协议(MCP):AI 应用的“USB-C”接口技术
开发语言·人工智能·经验分享
aramae4 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
滚雪球~4 小时前
量化交易 防止Windows电脑自动更新并重启
python·量化
jimy15 小时前
readelf 查看“派生类”的vtable符号
开发语言·c++
L@ncor5 小时前
第二章可能出现的问题
人工智能·python