文章目录
- 本地图片重命名
- 文件夹内容
- 图片重命名
- md文件内图片本地地址更改为图床地址
- 读入md文件内容
- 查找md文件内容中的图片
- 将图片本地地址更改为图床地址
- 将修改后的md文件内容保存
- 最后将重命名后的图片上传到图床
- 图床工具:PicGo
- 其他
- py文件如下
- 使用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)