Python:将markdown文件中图片的相对地址自动修改为图床地址

  • 使用jupyter notebook写数据分析报告,并将报告导出为md文件;该md文件稍作修改便可上传到博客如CSDN,避免了在博客中重新组织代码和结果。
  • 但若在jupyter notebook中画图,则导出md文件时会是一压缩文件夹,文件夹内是md文件以及画图生成的图片,md文件内图片使用的是本地地址。
  • md文件上传到博客时,需要将图片本地地址更换为相应的图床地址才可正确显示,若jupyter notebook生成图片太多,手工完成这个工作比较耗时,因此可通过python编程实现这个过程。基本思路是:将生成的图片重命名以使得所有图片名具有唯一性;将md文件中图片的本地路径修改为相应的图床路径;将图片上传到图床。
  • 使用R语言的Rmarkdown写数据分析报告,导出的md文件中图片也使用本地地址,可按相同思路解决。
import os
import re
import time
import copy

本地图片重命名

jupyter notebook中若有图片生成,则下载md文件时会是一个压缩文件夹,压缩文件夹内是md文件以及画图生成的图片

文件夹内容

output_all = os.listdir("./")
output_all

文件夹内的图片:假设生成了这3个图片

output_png = []
for i in output_all:
    if i[-3:] == "png":
        output_png.append(i)
        
output_png
['output_1_0.png', 'output_2_0.png', 'output_3_0.png']

图片重命名

对文件夹内的每一个图片进行重命名:新图片名=图片名+当前时间+1/2/3/…;目的是让每一张图片名具有唯一性

rand = int(time.time())
rand
1594719279

每个图片及其对应的时间标识

num_png = []
num_png_dict = {}
for i, j in enumerate(output_png):
    num_png.append(j[:-4] + str(rand + i) + ".png")
    num_png_dict[j] = str(rand + i)

num_png_dict_copy = copy.deepcopy(num_png_dict)
num_png_dict_copy
{'output_1_0.png': '1594719279',
 'output_2_0.png': '1594719280',
 'output_3_0.png': '1594719281'}

对图片重命名

for i in num_png_dict.items():
    os.rename("./" + i[0], "./" + i[0][:-4] + i[1] + ".png")

md文件内图片本地地址更改为图床地址

读入md文件内容

md_content为字符串

with open("./test.md", encoding="utf-8") as f:
    md_content = f.read()

查找md文件内容中的图片

md_png_rude = re.findall(".*\.png", md_content)
md_png_rude
['![png](output_1_0.png', '![png](output_2_0.png', '![png](output_3_0.png']
md_png = [i.split("(")[1] for i in md_png_rude]
md_png
['output_1_0.png', 'output_2_0.png', 'output_3_0.png']

将图片本地地址更改为图床地址

https://**/img/为图床地址,修改后的图片地址如下

url_set = []
for i in num_png_dict_copy.items():
    url = "https://**/img/" + i[0][:-4] + i[1] + ".png"
    url_set.append(url)
    md_content = md_content.replace(i[0], url)
    
url_set
['https://**/img/output_1_01594719279.png',
 'https://**/img/output_2_01594719280.png',
 'https://**/img/output_3_01594719281.png']

将修改后的md文件内容保存

with open("./new_test.md", mode="w", encoding="utf-8") as f:
    f.write(md_content)

最后将重命名后的图片上传到图床

上传到图床后,就可以发现md文件中的图片正常显示了

图床工具:PicGo

这里使用的图床工具是PicGo

该工具有以下特点:

  • 支持图片批量上传
  • **.png的图片上传到图床后,对应的图床地址为:图床地址/**.png(确保PicGo设置中,未选中时间戳重命名)
  • 图片上传时,若图片中已有跟上传图片相同名称的图片,上传会失败;这也是对图片重命名,让每一个图片名具有唯一性的原因

其他

  • 该博客即是使用jupyter notebook写作,导出md文件后上传到csdn
  • 对于jupyter notebook中非画图生成的图片,使用时直接使用图床地址,导出的md文件中也是图床地址
  • 为了更加便捷,可以将本Code组织成py文件,并使用fire库(可参考博客)将py文件所需要的参数暴露给命令行,以后就可以使用命令行完成这个过程

py文件如下

使用方法

  • jupyter notebook下载md文件时下载到zip文件夹
  • 将该zip文件夹解压
  • 将该py文件放入到解压文件夹中(注意修改为自己的图床地址)
  • 打开cmd,cd到该解压文件夹路径,运行命令python **.py **.md**.py为py文件的名称,**.md为待处理的md文件,这样就得到了处理好的md文件
import os
import re
import time
import copy
import fire

def convert_md(md_name):
    output_all = os.listdir("./")

    output_png = []
    for i in output_all:
        if i[-3:] == "png":
            output_png.append(i)

    rand = int(time.time())

    num_png = []
    num_png_dict = {}
    for i, j in enumerate(output_png):
        num_png.append(j[:-4] + str(rand + i) + ".png")
        num_png_dict[j] = str(rand + i)

    num_png_dict_copy = copy.deepcopy(num_png_dict)

    for i in num_png_dict.items():
        os.rename("./" + i[0], "./" + i[0][:-4] + i[1] + ".png")

    with open("./" + md_name, encoding="utf-8") as f:
        md_content = f.read()

    md_png_rude = re.findall(".*\.png", md_content)

    md_png = [i.split("(")[1] for i in md_png_rude]

    url_set = []
    for i in num_png_dict_copy.items():
    # 此处修改为自己的图床地址
        url = "https://**/img/" + i[0][:-4] + i[1] + ".png"
        url_set.append(url)
        md_content = md_content.replace(i[0], url)

    with open("./new_" + md_name, mode="w", encoding="utf-8") as f:
        f.write(md_content)

if __name__ == '__main__':
  fire.Fire(convert_md)
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值