街景一直在后退 你的崩溃在窗外零碎 我一路向北 离开有你的季节|

园龄:粉丝:关注:

批量重命名markdown本地图片

批量重命名markdown本地图片

问题

之前在使用markdown记录时,习惯将所有markdown文件中的图片保存到当前目录下的img文件夹中,就像这样:

当我想要提取出一个md文件和他对应的附件时,就会无从下手(不想导出pdf),因为:

  1. 因为img文件夹内图片太多,全导出img会有多余的图片也在其中。
  2. 前期命名图片时也非常随意,导致图片是哪个文件的也无法区分。没法一个一个复制出来

思路

基于上述问题,我希望能够批量修改文件夹内的图片和md文件中的链接,将图片命名为如下格式:

[md文件名]-1
[md文件名]-2
...

这样后续就可以手动复制所有和该md文件相关的图片出来。

不考虑图片多个md中重复使用
也不太想修改图片到单独的assets文件这种方式

实现

通过python脚本来实现,可能会有不少bug,仅供参考,我是一个一个文件夹慢慢改 + 人工核实的
最终效果

主要功能

  1. 输入要修改的markdown文件夹绝对路径
  2. 遍历该目录中所有.md结尾的文件,并且通过正则获取其中的链接形式
  3. 根据该链接找到图片,重命名图片为[md文件名]-1,序号递增
  4. 修改md文件中的该链接

注意事项:

  1. 需要loguru库 pip install loguru
  2. 需要是标准的markdown link形式
  3. 需要是标准的markdown link形式
  4. 因为本身是只放在img文件夹中的,如果是其他文件名可能还要看情况写一下脚本
  5. 应该还是有不少问题的,仅供参考(要用的话最好还是一点一点改比较好,最好复制一份副本来测试使用)

已知问题:

  1. 最好不要有已经是这个格式的命名图片,可能会导致不能重命名,异常退出
  2. 最好不要有空格,不管是文件名还是图片。(也许可以正常运行...为此做了不少努力...能力有限...)
  3. 我是windows下运行,所以/和\,md文件中的链接是正斜杠/,脚本中找文件什么的有些会换成\
  import os
  import re
  import sys
  import urllib.parse
  from loguru import logger
  

## 配置图片存放的文件夹,是同目录下的文件夹

img_directory = 'img'

def check_img_name(directory):
        flag = 0
        for root, _, files in os.walk(os.path.join(directory)):
            for file in files:
                if file.endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp')):
                    base_name, file_extension = os.path.splitext(file)
                    if base_name.find("-"):
                        flag += 1
                        logger.warning(f"请确认该图片命令方式是否已经是对应的方式: {root}/{file}")

        if flag:
            r = input("确认命名方式正确(Y/n):")
            if r == "y" or r == "Y":
                pass
            else:
                sys.exit(1)

def process_markdown_directory(directory):
    # 图片保存在相同目录下的img文件夹中 不用加/
    for root, _, files in os.walk(directory):
        for file in files:
            if file.endswith('.md'):
                logger.info("======================" + file + "开始修改======================")
                markdown_file_path = os.path.join(root, file)
                with open(markdown_file_path, 'r', encoding='utf-8') as markdown_file:
                    markdown_content = markdown_file.read()
                # 获取Markdown文件的基本文件名(不包括扩展名),后续用来修改图片文件
                markdown_file_base = os.path.splitext(file)[0]

                # 查找Markdown内容中的图片链接
                img_links = re.findall(r'!\[.*?\]\((.*?)\)', markdown_content)
                logger.debug(img_links)

                # 遍历图片链接并检查图片是否存在并重命名图片文件
                for i, img_link in enumerate(img_links):
                    logger.debug("img_link = " + img_link)
                    img_extension = os.path.splitext(img_link)[1]
                    # 命名成 md文件名-1 md文件名-2的形式
                    new_img_name = f'{markdown_file_base}-{i + 1}{img_extension}'
                    logger.debug("new_img_name = " + new_img_name)
                    # 检查文件是否存在
                    try:
                     # md文件中的链接可能存在%20等符号,所以加了解析,其他文件不知道会不会出问题
                        img_file_path = os.path.join(urllib.parse.unquote(img_link))
                        logger.debug(img_file_path)
                        new_img_file_path = os.path.join(img_directory, new_img_name)
                        # 若存在该文件就不改名
                        # !!!这里可能有问题,如果有图片命名方式已经和这个一样的话会导致图片重命名出错 退出!!!
                        if img_file_path != new_img_file_path:
                            os.rename(img_file_path, new_img_file_path)
                            logger.success("重命名图片:" + img_file_path + "--->" + new_img_file_path)
                        else:
                            logger.warning("该文件已存在:" + img_file_path)

                        # 更新Markdown中的图片链接
                        new_img_name = new_img_name.replace(" ","%20")
                        logger.debug(new_img_name)
                        markdown_content = markdown_content.replace(img_link, img_directory + "/" + new_img_name)
                        logger.success("更新图片链接:" + img_link + "--->" + img_directory + "/" + new_img_name)
                        with open(markdown_file_path, 'w', encoding='utf-8') as markdown_file:
                            markdown_file.write(markdown_content)
                    except Exception as e:
                        logger.error(e)
                        sys.exit(1)
                # 保存更新后的Markdown内容

if __name__ == "__main__":
    logger.remove()
    logger.add(sys.stderr, level='INFO')
    # logger.add(sys.stderr, level='DEBUG')

    markdown_directory = input("请输入目录绝对路径:")
    os.chdir(markdown_directory)
    logger.info(markdown_directory)
    check_img_name(markdown_directory)
    process_markdown_directory(markdown_directory)

本文作者:d3solate

本文链接:https://www.cnblogs.com/d3solate/p/17802003.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   d3solate  阅读(158)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示