批量替换markdown文件中的图床链接

706 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

前言

本文介绍了如何使用Python批量替换Markdown文件中的图床链接。

程序有四个重要的全局变量:

oldURLnewURLdirdirBackup
之前的图床地址新的图床地址markdown文件夹地址markdown文件备份的地址

程序的功能如下,给出Markdown文件夹地址,程序遍历该文件夹下的所有文件,匹配以.md结尾的文件,匹配成功后:

  • 将Markdown文件备份到dirBackup指明的位置,Markdown文件重命名为上层文件夹的名称

    文件备份规则举例:

    • 文件 /dir/worknamedemo/readme.md 将会备份到 /dirBackup/worknamedemo.md
    • 文件 /dir/readme.md 将会备份到 /dirBackup/dir.md
    • 如果出现 /dir/ 下有 /dir/readme.md 和 /dir/readme2.md 程序备份功能不适用。因为两个文件均命名为dir.md。

    对应代码中的 copyfile(thisPath, replaceDir)

  • 替换原文件中的图床链接

    对应代码中的md_img_replace(thisPath)

    替换是直接对文件路径thisPath进行操作,不受限制

由于程序是设计用来替换readme.md类型的文件的,所以程序备份功能不适用于一个文件夹下有多个markdown文件的情况,因为备份默认会将md文件的文件名改为上层文件夹的文件夹名,但替换链接不受影响,因为替换是直接对文件路径进行操作。

使用说明

运行环境:

  • macOS 13.0.1
  • Python 3.9.6
  • 理论上Windows下通用,但没有测试

数据无价,操作需谨慎

建议运行前先将md_img_replace(thisPath)改成md_img_replace(replaceDir),先对备份出来的文件执行图床链接替换(程序备份功能不适用于一个文件夹下有多个markdown文件的情况,替换不受影响),校对一下修改后的Markdown文件图床链接正确,显示正常,之后再将该代码恢复为md_img_replace(thisPath),对原文件进行操作。

如果环境允许,建议使用Git进行版本管理,或提前备份后再操作。

程序

 import os
 from shutil import copyfile
 import re
 
 # 之前的图床地址
 oldURL = 'oldURL.demo'
 # newURL
 newURL = 'newURL.demo'
 # markdown文件夹地址
 dir = "/Users/demo/demoDir"
 # markdown文件备份的地址
 dirBackup = "/Users/demo/Documents/dirBackup/"
 
 
 def md_img_replace(md_file):
   # 用来存放markdown文件内容
     post = None  
     global total, success, failure, ignore
     # 使用utf-8 编码打开 by chalkit
     with open(md_file, 'r', encoding='utf-8') as f:  
         post = f.read()
         strinfo = re.compile(oldURL)
         post = strinfo.sub(newURL, post)
          # 如果有内容的话,就直接覆盖写入当前的markdown文件)
         if post:
             open(md_file, 'w', encoding='utf-8').write(post) 
 
 # 遍历
 for dirpath, dirnames, filenames in os.walk(dir):
     for filename in filenames:
         thisPath = os.path.join(dirpath, filename)
         if thisPath.endswith("md"):
             replaceDir = dirBackup + dirpath.split('/')[-1] + '.md'
             copyfile(thisPath, replaceDir)
             md_img_replace(thisPath)
 

运行效果图

程序输出被替换文件上层的文件夹名,因为程序设计原本是为了替换readme.md文件。

批量替换Markdown文件中的图床链接-演示