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

即可完成。

相关推荐
珎珎啊2 小时前
Python3 数据结构
数据结构·python
pele2 小时前
如何处理ORA-01152报错_恢复未完成导致的数据文件仍需介质恢复
jvm·数据库·python
xcbrand2 小时前
能源材料品牌策划公司哪家强
python·能源
hhb_6182 小时前
C Shell脚本编程与系统管理技术实践指南
java·c语言·开发语言
wjs20242 小时前
Rust 循环
开发语言
小雅痞2 小时前
[Java][Leetcode hard] 68. 文本左右对齐
java·开发语言·leetcode
棋子入局2 小时前
C语言制作消消乐游戏(3)
c语言·开发语言·游戏
l1t2 小时前
DeepSeek v4辅助编写调用Python包对用户数据做统计分析的页面
开发语言·javascript·python
qq_372154232 小时前
SQL如何避免隐式类型转换导致的慢查询_参数类型对齐与索引失效
jvm·数据库·python