python工具之清理 Markdown 中没有引用的图片

 更新时间:2022年06月10日 11:08:18   作者:​ 胡韶卿   ​  
这篇文章主要介绍了python工具之清理 Markdown 中没有引用的图片,文章围绕主题展开详细的的内容介绍,需要的朋友可以参考一下

前言:

之前,我写笔记的工具一直都是 notion,而且没有写博客的习惯。但是一是由于 notion 的服务器在国外,有时候很不稳定;二是由于 notion 的分享很不方便,把笔记分享给别人点开链接之后还要先登录才能查看内容。于是我又在 掘金 平台写了几篇随笔,但是掘金的文章无法通过本地 Markdown 上传直接发表,也无法下载之前上传过的文章,这样一来数据不保存在本地,以后迁移文章到别的平台的成本也更高。
后来在 Bilibili up主 TheCW 的推荐下学会使用了 Linux 和 vim,然后就喜欢上了使用 vim 写 Markdown 这种双手不需要离开键盘的感觉。而且博客园也开放了 Metaweblog 接口,可以很方便的将本地的笔记发表到自己的博客园。

灵感来源

使用 vim 写笔记不像 notion 一样,可以随时将不需要的图片删除而不会在本地留下垃圾文件,(typora 没怎么用过,不知道有没有类似的功能)而删除了本地笔记的图片引用之后还是会在文件夹留下垃圾图片残留,之前的做法是每次删除完图片都在文件夹里寻找名字相同的图片之后删除,这种方法低效费时,于是便萌生了写一个自动清理无引用图片小工具的想法。

Python

本着不重复造轮子的原则,我先在国内互联网搜寻了一番(看不懂英语),只看到 其他网站上有人用 java 写了一个类似的工具,但是内容不太看得懂,而且没有提供现成的工具包下载,只有源码。(本人比较懒...)
这种小工具当然还是用 Python 更友好啦~ 而且我是为了写这么一个东西才从头看的 Python,可以说之前对这门语言一无所知,只知道很火...... 小工具只有一个 .py 文件:

# utf-8

如何使用

因为只有一个文件,所以大家花一分钟看下源码大概就知道了,原理极其简单。(一个学了一下午 python 的人能写出什么复杂的东西)

  • 将 .py 文件 拷贝/移动到自己喜欢的位置,将该路径设置为 环境变量 路径,或者使用软链接到 /usr/bin 目录下
  • 因为能力有限且开发时间较短,工作目录必须严格遵循以下形式(未来可能会优化)
  .
├── imgs
│   ├── a.jpg
│   ├── b.png
│   └── c.png
├── list.md
├── note.md
└── time.md

这里的意思是说:所有的 Markdown 文件需要位于当前目录下,而所有的图片文件需要位于 ./imgs 路径下 (图片文件夹的名字可以是任意,不是必须叫 imgs )

移动到你想要清理无引用图片的上级目录(该目录下应该有 a.md b.md ...... imgs/),例如我这里有一个从 Notion 上下载下来的 Vue 笔记,但是我不小心在里面加了许多其他没用的图片,现在想删掉这些图片

该目录下只有一个 Vue-notion.md 和一个放有图片的文件夹 vuedir

使用:

python $APP_HOME/img-cleaner.py
# 原谅我这种愚蠢的写法

这里会提示需要你输入放置图片文件夹的名称:

输入之后按回车:

没有引用过的图片就会被移动到 ./_trash_bin 目录下

注意点:

  • 每行最多包含一个图片标签 ![]() ,因为没有关闭正则的贪婪匹配,如果多个图片写在一行的话则会报错
  • 2022-6-2 更新 :所引用图片的文件名可以带 空格符 ,代码会自动将 Markdown 内引用路径的文件名中的 %20 转码为 空格符,不过只允许在文件名中出现一次 空格符

源码

# -*-coding:utf-8 -*-
import re
import shutil
import os
# 获取工作路径
print("请输入你放置图片文件夹的名称: ")
print("注意,如果路径含有特殊符号需要用「\」转义")
_input = input()
# 创建 replace _trash_bin文件夹
if os.path.exists('./replace') == False:
  os.mkdir('./replace')
  print("创建文件夹成功:replace")
else:
  raise Exception("请删除当前目录下的 replace 文件夹后重试")
if os.path.exists('./_trash_bin') == False:
  os.mkdir('./_trash_bin')
  print("创建文件夹成功:_trash_bin")
else:
  raise Exception("请删除当前目录下的 _trash_bin 文件夹后重试")
# 撰写正则表达式
# pattern = re.compile('\(.*img\/.*\..*\)')
# pattern = re.compile('\(' + _input + '\/.*\..*\)')
pattern = re.compile('\!\[.*\]\(' + _input + '\/.*\)')
# 创建需要被移动的文件列表
find_list = []
# 获取当前路径下的 .md 文件
md_finder = os.listdir('./')
md_list = []
for item in md_finder:
  # 寻找 markdown 文件
  if item.endswith('.md') == True:
    md_list.append(item)
# 逐个读取 .md 文件
for md_item in md_list:
  f = open(md_item)
  md_str = f.read()
  f.close()
  result = pattern.findall(md_str)
  for i in range(len(result)):
    # 将图片路径逐个添加至 find_list
    index = result[i].find("]")
    # 将拿到的原始图片路径加工成 ./<imgs_name>/xxx.png 的形式
    add_item = "./" + _input + "/" + result[i][index + 3 + len(_input): len(result[i]) - 1]
    space_index = add_item.find("%20")
    # 如果路径中存在 空格符
    if space_index != -1:
      add_item = add_item[0: space_index] + " " + add_item[space_index + 3:]
    # 将图片路径添加至 find_list
    find_list.append(add_item)
# 将所有 markdown中 引用过路径的图片移动至 ./replace
for item in find_list:
  shutil.move(item, './replace')
  print(item + " 移动完成")
print("----------------------")
# 将没有引用的图片移至 _trash_bin
img_trashs = os.listdir('./' + _input)
trash_flag = 0
for item_trash in img_trashs:
  item_trash = "./" + _input + "/" + item_trash
  trash_flag = trash_flag + 1
  shutil.move(item_trash, './_trash_bin')
  print(item_trash + " in _trash_bin")
print("----------------------")
# 删除原本的 img 文件夹,并更改文件夹名称
os.removedirs('./' + _input + '/')
os.rename('./replace', _input)
print(str(trash_flag) + " 个 未引用")
print("移动成功!没有引用的图片已经移入至 _trash_bin")

到此这篇关于python工具之清理 Markdown 中没有引用的图片的文章就介绍到这了,更多相关python Markdown 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现数据清洗(缺失值与异常值处理)

    python实现数据清洗(缺失值与异常值处理)

    今天小编就为大家分享一篇python实现数据清洗(缺失值与异常值处理),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python中数组array和列表list的基本用法及区别解析

    python中数组array和列表list的基本用法及区别解析

    大家都知道数组array是同类型数据的有限集合,列表list是一系列按特定顺序排列的元素组成,可以将任何数据放入列表,且其中元素之间没有任何关系,本文介绍python中数组array和列表list的基本用法及区别,感兴趣的朋友一起看看吧
    2022-05-05
  • python中的闭包用法实例详解

    python中的闭包用法实例详解

    这篇文章主要介绍了python中的闭包用法,以实例形式详细分析了Python中闭包的概念及相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-05-05
  • numpy系列之数组合并(横向和纵向)

    numpy系列之数组合并(横向和纵向)

    本文主要介绍了numpy系列之数组合并(横向和纵向),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python去除列表中重复元素的方法

    Python去除列表中重复元素的方法

    这篇文章主要介绍了Python去除列表中重复元素的方法,实例分析了Python中去除列表重复元素的使用技巧,需要的朋友可以参考下
    2015-03-03
  • Python matplotlib画图与中文设置操作实例分析

    Python matplotlib画图与中文设置操作实例分析

    这篇文章主要介绍了Python matplotlib画图与中文设置操作,结合实例形式分析了Python使用matplotlib进行图形绘制及中文设置相关操作技巧,需要的朋友可以参考下
    2019-04-04
  • Python爬取破解无线网络wifi密码过程解析

    Python爬取破解无线网络wifi密码过程解析

    这篇文章主要介绍了Python爬取破解无线网络密码过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 基于K-Means聚类算法演示及可视化展示

    基于K-Means聚类算法演示及可视化展示

    这篇文章主要介绍了基于K-Means聚类算法演示及可视化展示,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • python虚拟环境virtualenv的安装与使用

    python虚拟环境virtualenv的安装与使用

    virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够:1. 在没有权限的情况下安装新套件 2. 不同应用可以使用不同的套件版本 3. 套件升级不影响其他应用
    2017-09-09
  • python基础入门之普通操作与函数(三)

    python基础入门之普通操作与函数(三)

    这篇文章主要介绍了python基础入门之普通操作与函数
    2021-06-06

最新评论