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