背景:md中插入图片与word不同,在word中图片是拷贝了一份放在文件中,与原图片无关,所以无论删除哪个互不影响,但是md中却不同,md中插入图片时用超链接的方式从外部引用,在设置中配置图片存放路径,一般情况下图片的存放路径在c盘,这极大的占用了系统资源,所以初用者最好把路径改为其他盘,因为时间久了,这个目录会非常大。当然看到这篇文章的你一定已经用过很久了。
由于md引用的外部链接,所以在文件中删除图片时只是删除了文本链接,却没有删除图片,导致图片目录中会存放很多失效的图片。所以就在网上找了相关的代码想要解决这个问题,谁也不想重复造轮子吧,有幸找到了,但是在使用中发现了一些问题,所以进行了如下优化
在原作者代码基础上进行优化,优化内容如下:
1、使用正则提取文本中的图片链接
2、原代码在md_path为文件路径的情况下会导致图片全部被删除。所以增加分支,使代码可以处理单独文本也可以处理一个目录
3、原代码直接将图片删除,新代码可选择是删除还是移动到新目录,一般会在桌面创建目录进行存放,目录名为typroa_image_bak+时间戳
4、将所有参数配置全部放到main中
import os
import re
import shutil
import time
# 遍历目录下所有文件,返回文件路径列表
# 输入的是绝对路径则返回绝对路径,输入的是相对路径则返回相对路径
def getfilelist(filetype, path='./',):#默认从当前路径下找
file_list = list()
if os.path.isdir(path):
for dirpath, dirnames, filenames in os.walk(path):
for filename in filenames:
if filename.endswith(filetype):#endswith里面可以跟一个元组
file = os.path.join(dirpath, filename)
file_list.append(file)
elif path.endswith(filetype):
file_list.append(path)
return file_list
# 把pic_list中的路径统一都改为反斜杠
def changeformat(pic_list):
new_pic_list = list()
for pic in pic_list:
pic = pic.replace('/', '\\')
new_pic_list.append(pic)
return new_pic_list
# 读取文件,默认以文本读取,编码类型为utf-8
def readfromfile(file, readmode='r', encoding='utf-8'):
with open(file, readmode, encoding=encoding) as f:
text = f.read()
return text
def main(md_path, pic_path, model, is_delect='no'):
print('开始搜索md文件和图片文件...')
md_list = getfilelist(path=md_path, filetype='.md')
pic_list = getfilelist(path=pic_path, filetype=('.png', '.jpg', '.jpeg'))
pic_list = changeformat(pic_list)
alive_pic_list = list()
print('开始遍历md文件内容...')
for md in md_list:
print(md)
text = readfromfile(md)
# 但凡pic在md中,这个pic就不能删#遍历图片列表每次都和文件内容进行匹配,如果有10张图5个文件,
# 就需要匹配5*10次
# 效率太低,改用正则匹配
if model:
for pic in pic_list:
if pic in text and not (pic in alive_pic_list):
alive_pic_list.append(pic)
else:
#使用正则匹配文中的图片引用
rule = re.compile("!\[.*?\d+\]\((.*?)\)",re.I)
result = rule.findall(text)
#为了防止列表里出现重复值,但是影响不大的话可以直接extend
for pic in result:
if pic not in alive_pic_list:
alive_pic_list.append(pic)
print('开始清理无效图片...')
if is_delect == 'yes':
for pic in pic_list:
if not (pic in alive_pic_list):
print("删除:",pic)
os.remove(pic)
if is_delect == 'no':
mask = 0
bak_dir_parent = os.path.dirname(os.path.realpath(__file__))
bak_dir = os.path.join(bak_dir_parent,'typroa_image_bak_'+time.strftime("%Y%m%d%H%M%S", time.localtime()))
# print(bak_dir)
if not os.path.exists(bak_dir):
os.mkdir(bak_dir)
for pic in pic_list:
if not (pic in alive_pic_list):
print('移动:', pic)
shutil.move(pic,bak_dir)
mask = 1
if mask:
print("保存到“{}”目录".format(bak_dir))
print('完成')
else:
print(">>>>>>>>>>无失效图片<<<<<<<<<<")
os.rmdir(bak_dir)
if __name__ == '__main__':
# md路径(可以是目录也可以是具体md文件)
# md_path = r'C:\Users\shenyangyang\Desktop\嵌入式笔记\1.linux.md'
md_path = r'C:\Users\shenyangyang\Desktop\嵌入式笔记'
# 图片保存路径
pic_path = r'D:\typroa_image'
#文件中图片搜索模式(1或0,0使用正则匹配(更快),但不同typroa版本存在格式不同的风险)
model = 0
#是否删除 yes 直接删除,no移动到备份目录
is_delect='no'
main(md_path, pic_path, model, is_delect)