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

即可完成。

相关推荐
用户昵称10031 分钟前
C/C++编程-工程实践-本地存储log的工程意义
c语言·开发语言
小玮看世界1 小时前
[Python]从“脏”数据到优雅实现:一个IoT滑动窗口最大值问题的测试驱动优化实录
linux·前端·python
吹什么轩2 小时前
c++复习:map和set的使用
开发语言·c++
必须得开心呀2 小时前
qt生成dump文件并定位异常
开发语言·qt
MC皮蛋侠客2 小时前
SQLAlchemy 系列(十一):从 1.x 到 2.x——渐进迁移与数据访问层治理
数据库·python
fpcc2 小时前
跟我学C++中级篇—内存流
开发语言·c++
魔镜前的帅比2 小时前
(开源项目)x-claw (设计)
python·ai·rust·开源
Cicada1282 小时前
ccvt:一个用 Rust 写的中国地图坐标系互转命令行工具
开发语言·后端·rust
1001101_QIA2 小时前
工控机网络配置
开发语言·数据库·php