批量修改文件中的markdown图片格式
默认情况下[[../../../感悟-知识/Obsidian|Obsidian]]引用图片是以![[filename.png]]格式引用,如果放到其它劫持[[../../../感悟-知识/Markdown|MarkDown]]格式的平台则不兼容。可以使用以下脚本将所有md文件中的![[]]格式改为![]()原生MarkDown格式。
import os
import re
def replace_image_format(directory):
# 定义目标格式的正则表达式(包含"media/Images"的情况)
# “[[media/Images/filename.png]]
pattern_with_path = r'!\[\[media/Images/([^\]]+)\]\]'
# 定义目标格式的正则表达式(不包含"media/Images"的情况)
# “[[filename.png]]
pattern_without_path = r'!\[\[([^\]]+)\]\]'
# 遍历目录下的所有文件
for root, _, files in os.walk(directory):
for file in files:
if file.endswith(".md"):
filepath = os.path.join(root, file)
# 读取文件内容
with open(filepath, 'r') as f:
content = f.read()
# 使用正则表达式查找目标格式并替换为新格式
if 'media/Images' in content:
new_content = re.sub(pattern_with_path, r'', content)
else:
new_content = re.sub(pattern_without_path, r'', content)
# 处理文件名中的宽度内容(如果有)“[[filename.png]]”
new_content = re.sub(r'\|\d+', '', new_content)
# 写入修改后的内容到文件
with open(filepath, 'w') as f:
f.write(new_content)
if __name__ == "__main__":
# 指定目录,替换该目录下所有md文件中的格式
target_directory = "/md_path"
replace_image_format(target_directory)ChatGPT解析
这段代码是一个Python脚本,用于遍历指定目录下的所有Markdown(.md)文件,并将文件中的图片格式进行替换。主要目的是将旧格式的图片链接转换为新格式的图片链接。
让我们逐段解析代码:
导入模块:
import os import re这段代码导入了
os模块,用于处理文件路径,以及re模块,用于进行正则表达式操作。replace_image_format(directory)函数: 这个函数用于遍历指定目录下的所有Markdown文件,并将文件中的图片链接格式进行替换。它接受一个参数directory,表示目标目录的路径。定义正则表达式:
pattern_with_path = r'!\[\[media/Images/([^\]]+)\]\]' pattern_without_path = r'!\[\[([^\]]+)\]\]'这两个正则表达式用于匹配不同的图片链接格式。
pattern_with_path用于匹配包含"media/Images"的图片链接格式,而pattern_without_path用于匹配不包含"media/Images"的图片链接格式。遍历目录下的Markdown文件:
for root, _, files in os.walk(directory): for file in files: if file.endswith(".md"): filepath = os.path.join(root, file) # ...这部分代码使用
os.walk()函数遍历指定目录directory及其子目录下的所有文件。对于每个文件,检查其扩展名是否为".md",如果是,则获取文件的完整路径filepath。 详细的解释可以参考[[#for root, _, files in os.walk(directory)解释]]读取文件内容并进行替换:
with open(filepath, 'r') as f: content = f.read() if 'media/Images' in content: new_content = re.sub(pattern_with_path, r'', content) else: new_content = re.sub(pattern_without_path, r'', content)这部分代码打开文件,读取文件内容,并使用正则表达式对文件内容进行匹配和替换。如果文件内容包含"media/Images",则使用
pattern_with_path对图片链接格式进行替换;否则,使用pattern_without_path对图片链接格式进行替换。处理文件名中的宽度内容:
new_content = re.sub(r'\|\d+', '', new_content)这行代码使用正则表达式匹配文件名中的宽度内容(如""),并将其替换为空字符串,从而删除图片链接中可能包含的宽度信息。
将修改后的内容写回文件:
with open(filepath, 'w') as f: f.write(new_content)最后,将修改后的内容
new_content写回原始的Markdown文件中,覆盖原有内容。
总结: 这段代码使用Python的os和re模块实现了遍历指定目录下的Markdown文件,并将图片链接格式进行替换的功能。它可以帮助将旧格式的图片链接转换为新格式的图片链接,并移除图片链接中可能包含的宽度信息。
for root, _, files in os.walk(directory):解释
for root, _, files in os.walk(directory):解释在这个for循环中,os.walk(directory)用于遍历指定目录下的所有文件和子目录。它返回一个三元组的生成器,其中包含三个部分:root、dirs和files。这个for循环会迭代遍历这个生成器,每次迭代都会得到一个新的三元组。
root:root是当前目录的路径。在第一次迭代时,root会指向指定的目录(directory),然后它会在每个子目录下递归遍历。dirs:dirs是一个包含当前目录下所有子目录的列表。在每次迭代中,dirs存储的是当前root目录下的所有子目录。files:files是一个包含当前目录下所有文件的列表。在每次迭代中,files存储的是当前root目录下的所有文件。
在这个特定的代码段中,我们只关心当前目录下的文件,所以用下划线 _ 代替了不需要的子目录列表 dirs。我们只需要遍历并处理当前目录下的文件,所以我们将dirs用下划线 _ 代替,而实际上不使用它。然后我们使用for循环逐个处理当前目录下的文件 files。
示例代码中的for循环会遍历指定目录 directory 及其子目录中的所有文件,并对每个md文件执行相应的处理操作。
最后更新于