【发布时间】:2021-05-25 14:46:04
【问题描述】:
我有一个关键字列表
Animals = ['dogs' , 'cat' , 'bird' ....]
我有一个包含许多文件的目录,这些文件可能会出现 1 个或多个关键字。
文件1.txt
- “我是一辆车,我去哔”
- “我是猫,我去喵”
- “我是一条狗,我会发疯”
文件2.txt
- “我是一口铃铛”
- “我是一只鸟,我去推特”
- “我是打印机,我去 brrr”
我想搜索目录中的每个文件,并检查我的动物列表中的所有匹配项。 我要记录文件名、行号、匹配、行。
示例所需的输出:
- File1.txt , 2 , cat , “我是猫,我喵喵”
- File1.txt , 3 , dog, “我是条狗,我发疯了”
- File2.txt , 2 , 鸟,“我是鸟,我去推特”
这可能吗? Python 是正确的工具吗? 我已经能够使用 python 运行一些正则表达式测试,但我无法访问特定的 行号、匹配和行。
import os
import re
words = ['dog' , 'cat' , 'bird' ]
rx = re.compile('|'.join(words), re.I)
for root, dirs, files in os.walk('C:\\MySearchDirectory\\'):
for filename in files:
if filename.endswith('.txt'):
with open(root + filename) as df:
data = df.read()
for match in rx.finditer(data):
print(filename + ' , ' + str(match) + ' , ' + str(match.span()))
【问题讨论】:
-
不确定最好的方法是什么,因为我不喜欢正则表达式,但你绝对应该使用
glob而不是os来获取文件名,因为它会更短。list_of_text_files = glob.glob('C:\\MySearchDirectory\\*.txt') -
glob也是内置的,所以你应该拥有它 -
您好,感谢您的评论,我将尝试使用 glob 重新编写代码,我在搜索此内容时看到了一些关于此的内容。如果我不使用正则表达式,我担心我只会强行搜索。所以对于我 wordSearch 列表中的每个元素,我会检查每个文件中的每一行。
-
正则表达式仍在检查每个文件中的每一行;没有办法逃脱(除了使用数据库而不是平面文件)。