脚本-next分类/markdown标题升级

目的:

next分类:也就是在相关分类下,所有文章的yaml配置中的categories都对新内容进行自动补全

标题升级:将一个#号替换为两个#号,2个#号替换为3个#号。。

1. 博客分类

个人对于博客分类的期望

image-20201106201125945

思路

  1. 创建文本文件,内容为文章的基准分类,在写文章时可以根据该文件确定分类

  2. 在每个md文件的yaml配置栏中增加“self-categories: ”项,格式为“基准分类-文章类型”比如本文的

    self-categories: python实战-脚本

  3. 对文本文件中的基准分类进行遍历,拿到一个基准分类后再对md文件进行遍历

    • 读出文件的yaml内容,提取self-categories项,和当前基准分类进行正则匹配,匹配结果不为空则md文档属于当前类。

    • 将属于当前分类的文档添加至相同列表md_filecate

    • 通过字符串切片将当前基准分类下的所有文章的“文章类型”提取,并放入同一列表content
    • 再对content列表进行字符串拼接,呈现在hexo上的分类标签就完成了
    • 再遍历md_filecate,即当前分类下的全部md文档,先读出yaml,在第5行(categories)写入拼接好的字符串,再把yaml写回md文档
  4. 命令行执行:切换到py文件的目录下,资源管理器的路径中输入cmd,在当前目录下执行

代码

gitee链接:https://gitee.com/biongd/sort-categoties

知识点

1.乱码的产生和解决

见博客为啥会出现乱码-python

最开始采用的方法是只读取yaml配置文件的内容,然后对分类的那一行进行更改,但是每次结束的下面一行或多行都会消失或出现黑色菱形中间带问号的乱码,百度了一下大概是换行符的原因

解决方法就是遍历整篇文章内容,然后再对某行进行修改,问题完美解决

2.os操作

菜鸟教程

os.listdir(path)返回path文件目录下的文件和目录列表

应该属于系统的文件和进程操

3.file操作

菜鸟教程

注意文件的读写操作调用方法的区别:

读:

  • read():返回一个字符串,整篇文章内容
  • readline():返回一个字符串,一行的内容(结合循环使用)
  • readlines():返回一个列表,元素为每一行的内容

注意:行由文章中的换行符区分,只要没回车都算一行,且换行符也会被读出来

写:

  • write():写入字符串
  • writelines():参数为列表,可以将readlines的返回值修改后再写回去

常用方法:

file.tell() 返回文件当前位置。
file.seek(offset, whence) 移动文件读取指针到指定位置

4.字符串操作

菜鸟教程

需要注意的:

  1. 转译字符
  2. 字符串运算符:in判断字符换从属关系;字符串切片,左闭右开[:]
  3. 常用方法:
join(seq) 以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
split(str=””, num=string.count(str)) num=string.count(str)) 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串
strip(chars) 在字符串上执行 lstrip()和 rstrip(),清除字符串左右两边的空格

此外还有大小写转换等方法。

5.正则

正则表达式的使用

注意点

  1. self-categories+冒号+空格的格式不能错,后面字符串切片的字符串长度是固定的

  2. 本意是只读取文件的yaml配置信息,但是在写入的时候总是会在写入行的下一行出现黑色菱形带问号的乱码。不出意外应该是换行符导致的。

    后面修改为读取整篇文章+修改字符串+把文章写回去,问题解决,写入和读取也不会报错了。

  3. 分类文档的最后一行输入后必须换行,否则在读的时候会将最后一个字符删除,换行后Ok

2. 标题升级/降级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import re
# path:文件路径
path = "D:/biongd/blog/source/_posts/python脚本.md"
oldString = "#"
newString = "##"
def changeLevel(path,oldString,newString):
with open(path,"r+",encoding="utf-8") as f:
# content字符串链表
content= f.readlines()
# 读完后,光标移至结尾
count = len(content)
for i in range(count):
line= content[i]
ex=re.compile(f'{oldString}.*')
if(re.match(ex,line)!=None):
# 将正则字符串修改后
content[i] = re.sub(oldString,newString,line,count=1)
#光标移至首行
f.seek(0,0)
f.writelines(content)
f.close()
def changeStr(path,oldString,newString):
with open(path,"r+",encoding="utf-8") as f:
# content字符串链表
content= f.readlines()
# 读完后,光标移至结尾
count = len(content)
for i in range(count):
line= content[i]
ex= oldString
if(re.match(ex,line)!=None):
# 将正则字符串修改后
content[i] = re.sub(oldString,newString,line,1)
#光标移至首行
f.seek(0,0)
f.writelines(content)
f.close()
changeLevel(path,oldString,newString)

同样可以替换字符串,解决了通过ctrl+H替换时,一个#总会替换为两个导致2个替换为4个,成了翻倍降级