批量修改文件中的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'![](../../../media/Images/\1)', content)
                else:
                    new_content = re.sub(pattern_without_path, r'![](../../../media/Images/\1)', 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)文件,并将文件中的图片格式进行替换。主要目的是将旧格式的图片链接转换为新格式的图片链接。

让我们逐段解析代码:

  1. 导入模块:

    import os
    import re

    这段代码导入了os模块,用于处理文件路径,以及re模块,用于进行正则表达式操作。

  2. replace_image_format(directory)函数: 这个函数用于遍历指定目录下的所有Markdown文件,并将文件中的图片链接格式进行替换。它接受一个参数directory,表示目标目录的路径。

  3. 定义正则表达式:

    pattern_with_path = r'!\[\[media/Images/([^\]]+)\]\]'
    pattern_without_path = r'!\[\[([^\]]+)\]\]'

    这两个正则表达式用于匹配不同的图片链接格式。pattern_with_path用于匹配包含"media/Images"的图片链接格式,而pattern_without_path用于匹配不包含"media/Images"的图片链接格式。

  4. 遍历目录下的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) 解释]]

  5. 读取文件内容并进行替换:

    with open(filepath, 'r') as f:
        content = f.read()
    
    if 'media/Images' in content:
        new_content = re.sub(pattern_with_path, r'![](../../../media/Images/\1)', content)
    else:
        new_content = re.sub(pattern_without_path, r'![](../../../media/Images/\1)', content)

    这部分代码打开文件,读取文件内容,并使用正则表达式对文件内容进行匹配和替换。如果文件内容包含"media/Images",则使用pattern_with_path对图片链接格式进行替换;否则,使用pattern_without_path对图片链接格式进行替换。

  6. 处理文件名中的宽度内容:

    new_content = re.sub(r'\|\d+', '', new_content)

    这行代码使用正则表达式匹配文件名中的宽度内容(如""),并将其替换为空字符串,从而删除图片链接中可能包含的宽度信息。

  7. 将修改后的内容写回文件:

    with open(filepath, 'w') as f:
        f.write(new_content)

    最后,将修改后的内容new_content写回原始的Markdown文件中,覆盖原有内容。

总结: 这段代码使用Python的osre模块实现了遍历指定目录下的Markdown文件,并将图片链接格式进行替换的功能。它可以帮助将旧格式的图片链接转换为新格式的图片链接,并移除图片链接中可能包含的宽度信息。


for root, _, files in os.walk(directory):解释

在这个for循环中,os.walk(directory)用于遍历指定目录下的所有文件和子目录。它返回一个三元组的生成器,其中包含三个部分:rootdirsfiles。这个for循环会迭代遍历这个生成器,每次迭代都会得到一个新的三元组。

  1. rootroot是当前目录的路径。在第一次迭代时,root会指向指定的目录(directory),然后它会在每个子目录下递归遍历。

  2. dirsdirs是一个包含当前目录下所有子目录的列表。在每次迭代中,dirs存储的是当前root目录下的所有子目录。

  3. filesfiles是一个包含当前目录下所有文件的列表。在每次迭代中,files存储的是当前root目录下的所有文件。

在这个特定的代码段中,我们只关心当前目录下的文件,所以用下划线 _ 代替了不需要的子目录列表 dirs。我们只需要遍历并处理当前目录下的文件,所以我们将dirs用下划线 _ 代替,而实际上不使用它。然后我们使用for循环逐个处理当前目录下的文件 files

示例代码中的for循环会遍历指定目录 directory 及其子目录中的所有文件,并对每个md文件执行相应的处理操作。

最后更新于