title: python过滤目录下所有文件包含的关键字 #标题tags: python #标签
date: 2021-12-07
categories: python # 分类

背景

前段时间重装系统了,将原来的博文源文件copy到新系统上后,导致文件的创建日期都成为了我copy到新系统上的日期,一开始没当回事,今天找之前的博客,有引入自己的博文链接,点击链接报错404,才想到,由于我在博文开头没有定义date属性,导致博客的url路径是以博文源文件的创建日期作为路径的一部分的,如:https://lvjianzhao.gitee.io/lvjianzhao/2021/10/31/python数据类型/ ,所以导致之前的链接失效,造成了404,所以想改一下之前的链接,或者改一下博文源文件,增加date属性,不管怎样,总是要找到哪些文件中引入了自己的博文,不是么?

想想这300来篇文章,一个个找的话,估计眼都要找瞎了,正好咱学了半年python,还没怎么用过呢,想着就用python来实现下找到这些文件,以及引用链接的所在行数。

python代码

  1. import os
  2. import re
  3. # 博文所在目录
  4. path = r'E:\blogs\blog\source\_posts'
  5. file_path = os.listdir(path)
  6. # 定义要过滤的关键字
  7. keyword = 'https://lvjianzhao.gitee.io/lvjianzhao/\d{4}/\d{2}/\d{2}'
  8. # 指定过滤结果保存文件
  9. ret_file = r"C:\Users\Administrator\Desktop\ret.txt"
  10. # 由于要多次调用这个正则,故进行预编译,提高程序运行效率
  11. rec = re.compile(keyword)
  12. # 过滤
  13. def grep_keyword(file_name):
  14. linenum = 0
  15. dic_list = {}
  16. with open(file_name, encoding='utf-8', mode='r') as f1:
  17. f_name = f1.name
  18. for line in f1:
  19. linenum += 1
  20. r = rec.findall(line)
  21. if len(r):
  22. dic_list[linenum] = r
  23. f1.flush()
  24. if len(dic_list):
  25. # 将过滤结果写入指定的文件中
  26. with open(ret_file, encoding='utf-8', mode='a') as f2:
  27. flag = '#' * 25
  28. f2.write(f'{flag} {f_name} {flag}\n\n')
  29. for k, v in dic_list.items():
  30. f2.write(f'第{k} 行:{v}\n')
  31. f2.write('\n\n\n\n')
  32. os.chdir(path)
  33. for i in file_path:
  34. grep_keyword(i)

返回结果

python过滤目录下所有文件包含的关键字 - 图1

好,找到这些文件的话,只能一个个去找对应的文件,去按照过滤出来的链接日期,去增加相应的date属性咯,如下:

title: 部署Prometheus监控k8s集群
tags:  监控       #标签
date: 2021-09-21 22:13:00      # 定义date,以便使用date来作为url的一部分
categories:  python        # 分类

进阶需求

用了两个月的windows 11,终于不习惯,又换回了windows10,还是由于之前的文章开头没有指定date,导致文章的访问路径又变了,这…换一次系统就换一次访问路径,实属有点不太好,,那就写个代码,把所有的文章中没有指定date的,都加上date,并且指定为文件最后一次修改的日期。

# -*-coding:utf-8-*-
import os
import time

# 博文所在目录
path = r'E:\blogs\blog\source\_posts'
file_path = os.listdir(path)

os.chdir(path)


# 过滤没有添加date属性的文章名称
def grep_keyword(file_name):
    linenum = 0
    with open(file_name, encoding='utf-8', mode='r') as f1:
        for line in f1.readlines():
            linenum += 1
            if linenum < 10:  # 只看前10行即可
                if 'date:' in line:
                    return None
                else:
                    fname = file_name
    return fname


# 将过滤后的文件名写入一个列表中
file_list = []
for filename in os.listdir(path):
    res = grep_keyword(filename)
    if res:
        file_list.append(res)

# 
for filename in file_list:
    # print(filename)
    filemt = time.localtime(os.stat(filename).st_mtime)
    update_date = time.strftime("%Y-%m-%d", filemt)
    insert_text = '---\ndate: ' + update_date + '\n'  # 拼接要插入的内容
    new_file = filename + '_new'
    with open(filename, encoding='utf-8', mode='r') as f1, \
            open(new_file, encoding='utf-8', mode='w') as f2:
        Text = f1.readlines()  # 将文章所有内容读取到一个名为Text的列表中,每一行作为列表中的一个元素
        Text[0] = insert_text  # 通过索引取值,将第一行的内容“---”替换为上面拼接的字符串:insert_text
        newdata = ''.join(Text)  # 将修改后的列表重新join为字符串
        f2.write(newdata)  # 写入一个新文件中

    # 删除旧文件,然后将新文件改名为旧文件    
    os.remove(filename)
    os.rename(new_file, filename)