递归查找特定中英文字符

由于自己写博客,总有些词语不能碰,比如说公司相关的机密以及法律严禁的词语,因此自己写了个小的程序来查找特定目录下所有文件是否包含指定的中文或英文词语,有的话将对应的文件和行号输出。

下面的代码只是实现简单的功能,效率非常的差,因为嵌套了多层循环。但是没办法,python的语法和库不是很懂,只能按照写C的逻辑来实现功能了。

对中文字符的处理,必须使用UTF-8的格式,否则有可能出现如下类似的错误:

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xc6 in position 18: invalid continuation byte

代码如下:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import os
import chardet
import re

fstr_en = ['wowothink', '123456', 'fuck']
fstr_zh = [u'傻B', u'变异']

# 递归目录中所有文件,查找是否带有fstr指定的英文字符,有的话输出到log中
def findstr_en(dirname, fstr):
hit_num = 0
for filenames in os.listdir(dirname):
filenames = os.path.join(dirname, filenames)
if os.path.isfile(filenames):
with open(filenames, 'r', encoding='utf-8') as f:#打开文件
for line_num, line_str in enumerate(f, 1): #每次从文件读取一行存到 line_str 中
for str in fstr: #依次从待查找的字符串数组中取出一个字符串比较
for match in re.finditer(str, line_str): #使用正则表达式查找 fstr 字符串在 line_str 的位置
hit_num = hit_num + 1
print("[%d] hit string: %s, in file: %s, index: %d, line number: %d" %(hit_num, str, filenames, match.start(), line_num)) #打印要查找的str在文件中所在的行号和index
f.close()
elif os.path.isdir(filenames): #目录文件继续递归
#print(filenames)
findstr_en(filenames, fstr)


# 递归目录中所有文件,查找是否带有fstr指定的中文字符,有的话输出到log中
def findstr_zh(dirname, fstr):
hit_num = 0
for filenames in os.listdir(dirname):
filenames = os.path.join(dirname, filenames)
if os.path.isfile(filenames):
with open(filenames, 'r', encoding='utf-8') as f:#打开文件
for line_num, line_str in enumerate(f, 1): #每次从文件读取一行存到 line_str 中
for match in re.findall('[\u4e00-\u9fa5]+', line_str): #使用正则表达式查找 line_str 字符串中所包含的中文字符,保存到match中
for str in fstr: #从待查找的字符中依次取出一个字符串放到str中
for temp in re.finditer(str, match): #依次从match中查找是否有与str匹配的字符串,有的话保存到temp中
hit_num = hit_num + 1
print("[%d] hit string: %s, in file: %s, line number: %d" %(hit_num, str, filenames, line_num)) #打印要查找的str在文件中所在的行号和index
f.close()
elif os.path.isdir(filenames): #如果目录文件继续递归
#print(filenames)
findstr_zh(filenames, fstr)

if __name__ == '__main__':
dirname = "./_posts"
findstr_en(dirname, fstr_en)
print("find English string, all file check ok")

findstr_zh(dirname, fstr_zh)
print("find Chinese string, all file check ok")