🚩 写在前面
前几天学习了python的文件读取操作,可以用来干点什么呢?嘿,正好很多平台都推出了博客月更活动,但由于不同的平台环境(如markdown语法差别、活动要求),每搬运一篇博客都要幸苦地进行一些重复性的手动修改,实在是麻烦。人生苦短,我决定试试 python 能不能帮我做这件事。
小贴士: 不必完全按照文章的编写顺序阅读,可以先试着看看效果展示。
⭐ 功能规划(以掘金为例)
1、其实我们需要做的事情很简单,就是对文本进行一些增添、删除和替换。要把博客搬运到掘金,首先要面对一些掘金不支持(或效果不同)的 markdown 语法:
- 掘金不支持CSDN中双等号的高亮语法 ==高亮文本== 。
- 掘金不支持像
*.png =x300
这样调整图片大小的语法。 - 掘金连续的两行显示出来中间只有一个空格,有空行才会换行
- 掘金不支持用
@[toc]
在博客中显示文章目录。
2、如果你要参加更文活动,往往还需要再博客中附上相应的活动描述、活动链接:
- 需要去掉CSDN的更文活动链接,例如:CSDN话题挑战赛第2期 参赛话题:学习笔记
- 然后加上掘金的更文活动链接,例如:持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第N天,点击查看活动详情
3、为了让博客更加美观,还可以加上掘金的 markdown 主题:
---
theme: healer-readable
highlight: a11y-dark
---
4、最后,还可以做一些个性化的修改:
- 例如,在自己CSDN个人主页的链接前,加上CSDN标志词
📜 开始干活
虽然学了文本的读取,但我还不会使用 python 进行文本的替换,怎么办呢?此时我们打开CSDN的搜索框,输入:python 替换文件内容,然后C一下 😄
于是我找到了以下能 r u n run run 的代码:(原文链接,Python 修改文件内容3种方法(替换文件内容))
import os
def alter(file,old_str,new_str):
#"""
#将替换的字符串写到一个新的文件中,然后将原文件删除,新文件改为原来文件的名字
#:param file: 文件路径
#:param old_str: 需要替换的字符串
#:param new_str: 替换的字符串
#:return: None
#"""
with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2:
for line in f1:
if old_str in line:
line = line.replace(old_str, new_str)
f2.write(line)
os.remove(file)
os.rename("%s.bak" % file, file)
alter("file1", "python", "测试")
上面这段代码将文本替换的操作打包在了一个函数里,只能说真的很棒,copy 下来马上就能投入使用。但这还只有文本的替换,我们还需要添加和删除文本,要怎么办呢?
-
删除: 将目标文本替换为空字符串即可,例如:
alter("file1", "python", "")
- 添加: 可在原代码基础上做些修改即可,请看下面的代码
import os
def add_font(file, text):
# 将 text 字符串添加在文件开头
with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2:
f2.write(text)
for line in f1:
f2.write(line)
os.remove(file)
os.rename("%s.bak" % file, file)
但是,一次只能替换一个文件中的内容,如果你有 50 篇博客要搬运,就要将脚本运行 50 次,是不是太慢了?于是我们还可以试着实现文件的批量操作,利用下面的代码我们就能得到当前 python 脚本所在目录下,所有文件名构成的一个列表。可以自己试着用pirnt(dirs)
打印出来看一看。
path = './' # 该 py 脚本所在目录
dirs = os.listdir(path)
但是请一定小心,我们要修改的只是记录博客的 markdown 文件,后缀为.md
,不要把其它的文件也修改掉了。小贴士:最好将该 python 脚本单独放在一个专用的文件目录下!。
可以使用通配符来进行.md
文件的筛选:(参考资料:【Python】python通配符,使用通配符进行字符串匹配 )
# 记得导入依赖的包!
from fnmatch import fnmatch
print(fnmatch(filename, '*.md'))
如果文件filename
后缀为.md
,fnmatch
函数就会返回 true,否则返回 false 。
🌻 产品新鲜出炉(代码实现)
计划的差不多了,下面就动手来将它实现叭:
# -*- coding: utf-8 -*-
import os
from fnmatch import fnmatch
# -----------------------------------------------------------------------------------------------
def alter(file,old_str,new_str):
# """
# 将替换的字符串写到一个新的文件中,然后将原文件删除,新文件改为原来文件的名字
# 小贴士:采用按行匹配,故传入的字符串参数不应包含多行
# :param file: 文件路径
# :param old_str: 需要替换的字符串
# :param new_str: 替换的字符串
# :return: None
# """
with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2:
for line in f1:
if old_str in line:
line = line.replace(old_str, new_str)
f2.write(line)
os.remove(file)
os.rename("%s.bak" % file, file)
# -----------------------------------------------------------------------------------------------
def add_font(file, text):
# 在开头添加一段字符串
with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2:
f2.write(text)
for line in f1:
f2.write(line)
os.remove(file)
os.rename("%s.bak" % file, file)
# -----------------------------------------------------------------------------------------------
# 主程序
path = './' # 该 py 脚本所在目录
dirs = os.listdir(path)
num = 1
for filename in dirs:
if(fnmatch(filename, '*.md')):
print(str(num) + ' ' + filename)
num = num + 1
print('以上为当前目录下的所有 md 文件,是否继续替换?\n')
input('按回车开始替换')
for filename in dirs:
if(fnmatch(filename, '*.md')):
print('已替换:'+filename)
add_font(filename, "---\ntheme: healer-readable\n---\n持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第N天,[点击查看活动详情](https://juejin.cn/post/7147654075599978532 \"https://juejin.cn/post/7147654075599978532\")\n")
alter(filename, "[清风莫追]", "[CSDN清风莫追]")
alter(filename, " =300x", "")
alter(filename, " =400x", "")
alter(filename, " =500x", "")
alter(filename, "==", "**")
alter(filename, ">个", ">\n>个")
alter(filename, ">系", ">\n>系")
alter(filename, ">推", ">\n>推")
alter(filename, "> 个", ">\n> 个")
alter(filename, "> 系", ">\n> 系")
alter(filename, "> 推", ">\n> 推")
alter(filename, "@[toc]", "")
alter(filename, "[CSDN话题挑战赛第2期](https://marketing.csdn.net/p/7b6697fd9dd3795a268d1a6f2fe75012)", "")
alter(filename, "参赛话题:[学习笔记](https://activity.csdn.net/creatActivity?id=10213)", "")
print("已将所有md文档替换为掘金10月月更版本!")
🌾 效果展示
左:替换后的效果 | 右:原始效果
第一步:将写好的脚本和待替换的文件放在同一目录下
第二步:运行脚本(注意不是直接点击运行,我们假设你已经懂得如何运行python文件)
然后就 O K OK OK 啦,快将你替换后的文件复制到掘金看看效果吧!
🧭 待改进的地方
1、换行: 连续的两行在掘金中将被当作一行,当中间有空行时,才显示为两行。但是我又不能简单地在所有行末都加上一个换行符,比如在贴代码时,换行又不会需要中间有空行。这个还没想好怎么处理。
2、通配符: 搜索待替换的文本时,最好可以用到通配符的方法。比如调整图片比例的语法会产生很多相似的字符串:=x500
,=x400
,=x300
。
3、不够自动化: 还是要先将博客从CSDN上一篇一篇地导出到本地,要是以后可以自动爬取下来就好了。
4、使用不够方便: 当文本替换的需求变化时,就需要在代码里进行修改。
······
欢迎大家提出自己的建议!文章来源:https://www.toymoban.com/news/detail-656337.html
个人主页-CSDN:清风莫追文章来源地址https://www.toymoban.com/news/detail-656337.html
到了这里,关于【python-致用】为嫖掘金月更奖品,我用刚学的python做了个批量文件内容替换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!