python⽣成⽂章标题_「懒惰的美德」我⽤python写了个⾃动
⽣成给⽂档⽣成索引的脚本...
我⽤ python 写了⼀个⾃动⽣成索引的脚本简介:为了刷算法题,建了⼀个 GitHub仓库:PiperLiu / ACMOI_Journey,记录⾃⼰的刷题轨迹,并总结⼀下⽅法、⼼得。想到⼀个需求:能不能在我每新增⼀条题⽬的笔记后,利⽤程序⾃动地将其归类、创建索引?⽤ Python 实现⼀个⼊门级的⼩脚本,涉及到⽂件读写、命令⾏参数、数组操作应⽤等知识点,在此分享给朋友们。
需求实现
我有⼀个 Markdown ⽂档,长成下⾯这个样⼦:# ACM/OI Journey
在此留下刷题痕迹与刷题⼼得。
不定期的⽅法论总结在这⾥[./notes/README.md](./notes/README.md)。
学习资料:
- OI Wiki: /
-
⼒扣中国: leetcode-cn/
## 归档
## ⽇期归档
注意到,两个⼆级标题## 归档与## ⽇期归档下空空如也。
我的需求是,我刷完⼀道题,就将其记录在## ⽇期归档下,格式为: - uu ⽇期 题⽬名称与概括 类别A 类别B 类别C... [程序⽂件1] [程序⽂件2] [程序⽂件3]...
假设我今天刷了 2 道题,那么我就将其记录在我的## ⽇期归档下⾯,如下所⽰。## ⽇期归档
- uu 2020.11.26 盛最多⽔的容器『因为两个边共同决定了上限,因此将较短边向内移动,抛弃搜索次优解』 双指针法 搜索 [py]
(./vsc_leetcode/11.盛最多⽔的容器.py) [cpp](./vsc_leetcode/11.盛最多⽔的容器.cpp)
- uu 2020.11.27 整数转罗马数字『⽣活中从⼤的位数开始描述数字,因此从⼤的数与字符开始匹配』 匹配 字符串 [cpp]
(./vsc_leetcode/12.整数转罗马数字.cpp)
⽽我的## 归档下⾯还什么都没有,我希望我的脚本可以⾃动帮我在## 归档下创建三级⽬录:双指针法、搜索、匹配、字符串,并且将对应的题⽬放到下⾯去。
最终的效果是:## 归档
- [匹配](#匹配)
- [字符串](#字符串)
- [双指针法](#双指针法)
- [搜索](#搜索)
### 匹配
- 整数转罗马数字『⽣活中从⼤的位数开始描述数字,因此从⼤的数与字符开始匹配』 [cpp](./vsc_leetcode/12.整数转罗马数字.cpp) 2020.11.27
### 字符串
- 整数转罗马数字『⽣活中从⼤的位数开始描述数字,因此从⼤的数与字符开始匹配』 [cpp](./vsc_leetcode/12.整数转罗马数字.cpp) 2020.11.27
### 双指针法
- 盛最多⽔的容器『因为两个边共同决定了上限,因此将较短边向内移动,抛弃搜索次优解』 [py](./vsc_leetcode/11.盛最多⽔的容
器.py) [cpp](./vsc_leetcode/11.盛最多⽔的容器.cpp) 2020.11.26
### 搜索
- 盛最多⽔的容器『因为两个边共同决定了上限,因此将较短边向内移动,抛弃搜索次优解』 [py](./vsc_leetcode/11.盛最多⽔的容
器.py) [cpp](./vsc_leetcode/11.盛最多⽔的容器.cpp) 2020.11.26
## ⽇期归档
- 2020.11.26 盛最多⽔的容器『因为两个边共同决定了上限,因此将较短边向内移动,抛弃搜索次优解』 双指针法 搜索 [py]
(./vsc_leetcode/11.盛最多⽔的容器.py) [cpp](./vsc_leetcode/11.盛最多⽔的容器.cpp)
- 2020.11.27 整数转罗马数字『⽣活中从⼤的位数开始描述数字,因此从⼤的数与字符开始匹配』 匹配 字符串 [cpp]
(./vsc_leetcode/12.整数转罗马数字.cpp)
经过 Markdown 引擎渲染后的效果如下图。
如上,我不但新增了三级标题### 匹配、### 字符串等,还为三级标题创建了⽬录索引链接。
最终程序实现如下图。
Python 与脚本⽂件
这样就要派上我们的 Python 出场了。我觉得这才是 Python 的⽼本⾏:脚本⽂件。记得Python猫曾经有篇⽂章,讲过为什么 Python 中的注释符号是 # ⽽不是 // 。
原因很可能是:Python的⽼本⾏,就是写这⼀个个易⽤的脚本⽂件的,与shell类似。
想想 Python 的特点:解释型语⾔、动态型语⾔、在命令⾏⾥可以⼀条⼀条地输⼊、os.system()可以
直接调⽤命令...所以,拿 Python 来执⾏⼀个个⼩任务(脚本⽂件)再合适不过了。
整体逻辑
逻辑是:先把⽂件读到内存中,以列表list的形式保存
列表list内,每⼀元素对应⼀句话
遍历列表,遇到元素## 归档则其之后的元素按照不同条件取出、分析
直到遇到元素## ⽇期归档,则把其之后的元素按条件取出、分析
细节在代码⾥(代码⽂件refresh.py),我使⽤汉语标明了。""" """
import os.path as osp
import re
def refreah():
"""
我要处理的⽂件是 README.md
那么我获取其绝对路径
注意这⾥处理的⽂件和代码⽂件处于同⼀⽬录下
"""
dirname = osp.dirname(__file__)
filepath = osp.join(dirname, "README.md")
"""
打开这个⽂件,其变量名是 f
"""
with open(filepath, 'r+', encoding='utf-8') as f: """
将⽂件的内容读到内存 f.read()
"""
content = f.read()
"""
以“换⾏符”/“回车”进⾏字符串分割
这样,row_list 每个元素就是⼀⾏⽂字了
"""
row_list = content.split('\n')
"""
下⾯开始把不同的⽬录对应的条⽬取出
"""
# found the un-packed row
un_packed_rows = []
dict_cata = {}
dict_row_flag = False
date_row_flag = False
dict_row_num = 0
date_row_num = 0
cur_cata = None
for idx, row in enumerate(row_list):
"""
如果到了 ## 归档 下⾯
"""
if dict_row_flag:
if "### " in row[:4]:
cur_cata = row[4:]
"""
data_cata 是我们的类别字典,最终效果为
data_cata = {
"匹配": [匹配的第1题, 匹配的第2题, ...],
"字符串": [字符串的第1题, 字符串的第2题, ...],
...
}
"""
dict_cata.setdefault(cur_cata, [])
elif "- " in row[:2] and not re.match('\[.*\]\(.*\)', row[2:]): """
这⾥⽤了⼀个正则
因为索引格式为
- [索引名称](#索引名称)
⽽题⽬格式为
- 题⽬ 程序 ⽇期
因此如果仅凭是否以「- 」开头,则难以区分⼆者
因此加了⼀个是否正则匹配 [*](*) 的判断
"""
dict_cata[cur_cata] = [row] + dict_cata[cur_cata]
else:
"""
判断是否到了 ## 归档 下⾯
"""
if row == "## 归档":
dict_row_flag = True
dict_row_num = idx + 1
"""
如果到了 ## ⽇期归档 下⾯
"""
if date_row_flag:
"""
- uu 是我⾃⼰设的格式
如果题⽬有 uu ,那么这条就是我要⽤脚本加到归档⾥的题⽬"""
if '- uu ' in row[:5]:
un_packed_rows = [row] + un_packed_rows
row_list[idx] = "- " + row[5:]
else:
"""
判断是否到了 ## ⽇期归档 下⾯
"""
if row == "## ⽇期归档":
date_row_flag = True
dict_row_flag = False
python中文文档date_row_num = idx + 1
# pack those rows to "## ⽇期归档"
"""
下⾯是把新题⽬(uu)加到 data_cata 字典中"""
for row in un_packed_rows:
row = row.split(' ')
file_num = 0
file_name = ""
for ele in row:
if re.match('\[.*\]\(.*\)', ele):
file_num += 1
file_name += (ele + ' ')
catas = row[4:-file_num]
for c in catas:
dict_cata.setdefault(c, [])
row_ = '- ' + row[3] + ' ' + file_name + row[2] dict_cata[c].append(row_)
# del file "## 归档"
"""
下⾯是清空 ## 归档 的内容
根据 dict_cata 书写新的全部内容
"""
row_list_a = row_list[:dict_row_num]
row_list_c = row_list[date_row_num-2:]
## row_list_b
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论