python提取markdown图片到当前文件夹并修改图片路径

发送markdown给别人时,图片路径老是让人恼火~

使用python脚本把markdown文件中图片提取,放到指定文件夹中,并修改md文件内路径为相对路径

包含python包 argparse, os, shutil, re

当前文件夹只有一个md文件时,默认把该文件作为输入,输出的md文件默认为原文件名

argparse.ArgumentParser() 从命令行获取md文件路径, 输出md文件名, 存图片文件夹名:

file_list = os.listdir()
count_md = 0
md_file = ''
for file in file_list:
    if file[-3:] == '.md':
        count_md += 1  # 计算当前文件夹md文件个数
        md_file = file
parser = argparse.ArgumentParser()
# 给这个解析对象添加命令行参数
if count_md == 1:  # 当前文件夹只有一个md文件
    parser.add_argument('--input', type=str, default=md_file, help='markdown file')
else:
    parser.add_argument('--input', type=str, help='markdown file')
parser.add_argument('--imgdir', type=str, default='img', help='存图片文件夹')
parser.add_argument('--output', type=str, help='输出md文件名')
args = parser.parse_args()

使用re进行正则提取md中文件路径,markdown中图片格式有 ![]()<img src=""> 两种,分别判断:

img_md = re.findall(r'![.*?]((.*?))', md)
img_html = re.findall(r'<img src="(.*?)" .*?/>', md)
img_paths = img_md + img_html

os.path.basename 获取文件路径的最后一段 (图片文件名) , shutil.copy 复制图片,replace进行替换

完整代码为:

import argparse
import os
import shutil
import re
# 当前文件夹内md个数计算
file_list = os.listdir()
count_md = 0
md_file = ''
for file in file_list:
    if file[-3:] == '.md':
        count_md += 1
        md_file = file
# 添加命令行参数
parser = argparse.ArgumentParser()
if count_md == 1:
    parser.add_argument('--input', type=str, default=md_file, help='markdown file')
else:
    parser.add_argument('--input', type=str, help='markdown file')
parser.add_argument('--imgdir', type=str, default='img', help='存图片文件夹')
parser.add_argument('--output', type=str, help='输出md文件名')
args = parser.parse_args()
imgdir = args.imgdir
mdout = 'mdout'  # 输出内容所在文件夹
print(f"输入文件: {args.input} 图片文件夹: {args.imgdir} 输出文件: {args.output}")
if args.output == None:  # 没有规定输出md文件名,则默认用原文件名
    args.output = os.path.join(mdout, os.path.basename(args.input))

print(f"输入文件: {args.input} 图片文件夹: {args.imgdir} 输出文件: {args.output}")
# 文件夹创建
if not os.path.exists(mdout):
    os.makedirs(mdout)
if not os.path.exists(os.path.join(mdout, imgdir)):
    os.makedirs(os.path.join(mdout, imgdir))
with open(args.input, 'r', encoding='utf-8') as f:
    md = f.read()
# 正则提取
img_md = re.findall(r'![.*?]((.*?))', md)
img_html = re.findall(r'<img src="(.*?)" .*?/>', md)
img_paths = img_md + img_html

for i in img_paths:
    img = os.path.join(imgdir, os.path.basename(i))
    shutil.copy(i, os.path.join(mdout, img))
    md = md.replace(i, img)

with open(args.output, 'w', encoding='utf-8') as f:
    f.write(md)

之后可以在 mdout 文件夹中找到输出md文件,里面的img文件夹存放了md包含的图片

效果为:

原md文件内容:

<img src="/Users/a/Library/Application Support/typora-user-images/image-20231229172044214.png" alt="image-20231229172044214" style="zoom:50%;" />

![image-20240122114932405](../../../../Library/Application Support/typora-user-images/image-20240122114932405.png)

这里文件夹内只有test.md一个markdown文件,不输入参数,用默认处理

show

处理后md文件内容:

<img src="img/image-20231229172044214.png" alt="image-20231229172044214" style="zoom:50%;" />

![image-20240122114932405](img/image-20240122114932405.png)

之后就可以把整个mdout文件夹压缩发给别人,在别人电脑上也可以正常显示了

有问题欢迎交流呢~