markdown文件中的图片存放路径

typora图片绝对路径的处理

多年使用typora,表示没有typora真的受不了,况且typora买了就是永久,不香吗?

当然我没有劝你买typora的意思,这还得看个人是否喜欢typora~~

typora有个不错的功能就是能够支持显示图片,跟word差不多。不过typora的图片都是放在本地的,因此有的时候想要把自己的markdown发给别人的时候都是需要将图片一个个找出来就非常的麻烦,当然typora支持导出pdf等格式的文件也是挺好的,不过不知道怎么说,有时候还是感觉少了点啥。

默认情况下,typora的复制的图片路径默认放在安装typora的文件夹下,因此如果要把所有图片提出来,手动的话太费劲了。于是我写了py程序根据md文件自动提取该文件所需的图片。

本次程序编写用到了几个模块,re(正则),shutil(shell 操作),os(操作系统 模块)

第一步:解析.md文件

def parsePath(source):  # C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\
    paths = []
    with open(source, "r+", encoding="utf-8") as f:
        file = f.readlines()
        for line in file:
            result = re.findall(r"\(C:\\Users\\lenovo\\AppData\\Roaming\\Typora\\typora-user-images\\.+?\)", line)
            if result:
                path = str(result[0]).replace("(", "").replace(")", "")
                paths.append(path)
    return paths

第二步:创建图片放置的目录

def mkdir(dirName):
    # print(dirName)
    try:
        os.mkdir(dirName)  # 创建文件夹存放图片
        # print(dirName,"文件夹创建成功!")
    except Exception as e:
        print(e)

第三步:移动图片文件

def moveFile(paths, dirName):
    while len(paths) > 0:
        tmp = paths.pop(0)
        # print(tmp)
        if (os.path.isdir(tmp)):  # 如果该路径是文件夹
            for item in os.listdir(tmp):  # 遍历该路径中文件和文件夹
                paths.append(os.path.join(tmp, item))  # 将所得路径加入队列queue
        elif (os.path.isfile(tmp)):  # 如果该路径是文件
            name = os.path.basename(tmp)  # 获取文件名
            dirname = os.path.dirname(tmp)  # 获取文件目录
            full_path = os.path.join(dirname, name)  # 将文件名与文件目录连接起来,形成完整路径
            des_path = dirName + '\\' + name  # 目标路径,将该文件夹信息添加进最后的文件名中
            shutil.move(full_path, des_path)  # 移动文件到目标路径(移动+重命名)
        else:
            print('-- file ', tmp, " not exist")

第四步:修改源.md文件的路径路径指向

def finalize(source, dest):
    # print(source)
    # print(os.path.getsize(source))
    global context
    with open(source, "r", encoding="utf-8") as f:
        context = f.read()
        # print('context',context)
        pattern = r'C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images'
        context = context.replace(pattern, dest)

    with open(source, "w", encoding='utf-8') as f:
        f.write(context)# 将文件进行覆盖

其实到这里已经差不多可以了。不过, 众所周知~ 人是比较懒的,我有那么一堆的.md文件需要更改路径,难道我一个个改吗?太累了~

于是我写了下面的一个函数封装了一下这个流程,准备再进一步地,对文件夹中所有的.md文件进行处理

第五步:封装修改单个.md文件的修改

def work(source_dir, source_filename):
    dest_dir = source_dir + r"\imgs"
    source = os.path.join(source_dir, source_filename)
    mkdir(dest_dir)
    parsePath(source)
    moveFile(parsePath(source), dest_dir)
    finalize(source, "imgs")

第六步:对设定的根目录进行遍历

if __name__ == '__main__':
    source_dir = r"E:\10-我的文件"
    for item in os.walk(source_dir):
        for file in item[2]:
            if file.endswith('.md'):
                try:
                    work(item[0], file)
                except:
                    with open('err.txt', 'a', encoding='utf-8') as f:
                        f.write(os.path.join(item[0], file) + '\n')  # 将错误文件的路径输出到err.txt文件中

ok,到这里,已经能够将指定目录下的所有以.md为后缀的文件中的图片都移动到imgs文件夹下了,并且,源.md文件的路径指向也都改成了相对路径。可以把md文件直接打包了,随便移动到哪里都不影响图片在typora中的正常显示!

最终汇总一下整个代码!如果要使用下面这段代码,要注意修改对应的路径哦~

import re
import shutil
import os


def parsePath(source):  # C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\
    paths = []
    with open(source, "r+", encoding="utf-8") as f:
        file = f.readlines()
        for line in file:
            result = re.findall(r"\(C:\\Users\\lenovo\\AppData\\Roaming\\Typora\\typora-user-images\\.+?\)", line)
            if result:
                path = str(result[0]).replace("(", "").replace(")", "")
                paths.append(path)
    return paths


def mkdir(dirName):
    # print(dirName)
    try:
        os.mkdir(dirName)  # 创建文件夹存放图片
        # print(dirName,"文件夹创建成功!")
    except Exception as e:
        print(e)


def moveFile(paths, dirName):
    while len(paths) > 0:
        tmp = paths.pop(0)
        # print(tmp)
        if (os.path.isdir(tmp)):  # 如果该路径是文件夹
            for item in os.listdir(tmp):  # 遍历该路径中文件和文件夹
                paths.append(os.path.join(tmp, item))  # 将所得路径加入队列queue
        elif (os.path.isfile(tmp)):  # 如果该路径是文件
            name = os.path.basename(tmp)  # 获取文件名
            dirname = os.path.dirname(tmp)  # 获取文件目录
            full_path = os.path.join(dirname, name)  # 将文件名与文件目录连接起来,形成完整路径
            des_path = dirName + '\\' + name  # 目标路径,将该文件夹信息添加进最后的文件名中
            shutil.move(full_path, des_path)  # 移动文件到目标路径(移动+重命名)
        else:
            print('-- file ', tmp, " not exist")


def finalize(source, dest):
    # print(source)
    # print(os.path.getsize(source))
    global context
    with open(source, "r", encoding="utf-8") as f:
        context = f.read()
        # print('context',context)
        pattern = r'C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images'
        context = context.replace(pattern, dest)

    with open(source, "w", encoding='utf-8') as f:
        f.write(context)
    # 将文件进行覆盖


def work(source_dir, source_filename):
    dest_dir = source_dir + r"\imgs"
    source = os.path.join(source_dir, source_filename)
    mkdir(dest_dir)
    parsePath(source)
    moveFile(parsePath(source), dest_dir)
    finalize(source, "imgs")


if __name__ == '__main__':
    source_dir = r"E:\10-我的文件"
    for item in os.walk(source_dir):
        for file in item[2]:
            if file.endswith('.md'):
                try:
                    work(item[0], file)
                except:
                    with open('err.txt', 'a', encoding='utf-8') as f:
                        f.write(os.path.join(item[0], file) + '\n')  # 将错误文件的路径输出到err.txt文件中

                # print(item[0],file)
                # print(os.path.join(item[0],file))

    # work_list=['python并发编程']
    # for item in work_list:
    #     work(source_dir, item+'.md')

更新,新版Typora 图像路径设置

可以在配置里面设置图像的路径如下图所示,这样子所有复制的图片都会保存到相对路径下面。

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sun_Raiser

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值