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()

即可完成。

相关推荐
天天进步201514 小时前
Python全栈项目--基于机器学习的异常检测系统
开发语言·python·机器学习
xxie12379421 小时前
return与print
开发语言·python
秋921 小时前
从 Python 后端工程师转型 AI Engineer(AI 工程化)的完整补课清单(2026实战版)
开发语言·人工智能·python
程序员二叉1 天前
【Java】 异常高频面试题精讲 | 易错点+对比总结
java·开发语言·面试
慕木沐1 天前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
Tbisnic1 天前
AI大模型学习第十一天:技术选型、安全防护与金融实战
python·学习·ai·大模型·提示词工程
Roann_seo%1 天前
C++文件操作完全指南:从文本读写到二进制文件处理
开发语言·c++
hboot1 天前
AI工程师第一课 - Python
前端·后端·python
huangdong_1 天前
淘宝商品SKU图自动分类技术深度解析:从DOM解析到智能归档
开发语言·javascript·ecmascript
阿正的梦工坊1 天前
【Rust】12-借用检查器与非词法生命周期
开发语言·后端·rust