前言:

之前,我写笔记的工具一直都是 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 内引用路径的文件名中的   转码为 空格符,不过只允许在文件名中出现一次 空格符

源码

# -*-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(" ")
    # 如果路径中存在 空格符
    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 内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

python工具之清理 Markdown 中没有引用的图片的更多相关文章

  1. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  2. html+js 实现markdown编辑器效果

    这篇文章主要介绍了html+js 实现markdown编辑器效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  4. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  5. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  6. 為 Swift 代碼編寫含有 Mardown 語法的文檔

    當然,使用HTML并不是Markdown的主要目的,我們的注意力還是要放到它自己的語法上來。反斜杠用於轉義,以避免某個字符被當成是Markdown語法的一部分。上面的內容是Markdown語法中最重要的基本元素。先來看一個簡單的Markdown語法的例子。可以看到,使用Markdown中特有的特

  7. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  8. swift 学习笔记(MarkDown)

    xcode中在学习swift中加入了对markdown语法的支持,可以实时查看打开xcode–>preferrence–>keybinding–>搜索showrenderedmarkup–>设置快捷键就行了当新建一个page的时候,活默认的有几句代码,这些注释用的是Markdown的语法添加的,上一页和下一页,按住刚才设置的快捷键就可以查看一下效果可以看到变成蓝色的了,是可以点击的,当page多的时候,就可以自动跳转上一页,和下一页了.其他的语法,看下markdown的官方文档就行MarkDown语法链接

  9. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  10. 在 Swift 專案中使用 Javascript:編寫一個將 Markdown 轉為 HTML 的編輯器

    你有強烈的好奇心,希望在你的iOS專案中使用JavaScript。jscontext中的所有值都是JSValue對象,JSValue類用於表示任意類型的JavaScript值。因此,我們既需要寫Swift代碼也要寫JavaScript代碼。此外,我們還會在JavaScript中按照這個類的定義來創建一個對象并對其屬性進行賦值。從Swift中呼叫JavaScript就如介紹中所言,JavaScriptCore中最主要的角色就是jscontext類。一個jscontext對象是位於JavaScript環境和本

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部