开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
前言
本文介绍了如何使用Python批量替换Markdown文件中的图床链接。
程序有四个重要的全局变量:
| oldURL | newURL | dir | dirBackup |
|---|---|---|---|
| 之前的图床地址 | 新的图床地址 | 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文件。