使用Python正则表达式搜索文件并返回文件名
请帮忙。 我正在几个目录中搜索几个.txt文件,寻找一个模式。如果有匹配项,我想打印匹配项的文件名和位置 这是我的密码:使用Python正则表达式搜索文件并返回文件名,python,regex,file,Python,Regex,File,请帮忙。 我正在几个目录中搜索几个.txt文件,寻找一个模式。如果有匹配项,我想打印匹配项的文件名和位置 这是我的密码: a = ('Z:/rodney/020year/2020-04/') b = [] for y in os.listdir(a): b.append(a+y+'/') for filename in b: path = filename for filenames in listdir(path): with open(path+fi
a = ('Z:/rodney/020year/2020-04/')
b = []
for y in os.listdir(a):
b.append(a+y+'/')
for filename in b:
path = filename
for filenames in listdir(path):
with open(path+filenames) as currentfile:
text = currentfile.read()
loan = re.compile(r'2 NNN \d LOANS')
bb = loan.search(text)
with open('z:/rodney/results.txt','a') as f:
f.write(os.path.dirname(path)+' ')
f.write(filenames[:-4]+'\n')
f.write(bb)
Error message=“TypeError:write()参数必须是str,而不是None”
如果有匹配项,我只希望看到匹配项的文件名和位置。我不需要在每个不匹配的文件中都看到“无”。您有:
bb = loan.search(text)
但是如果在text
中找不到您要查找的字符串,bb
将不会None
,因此f.write(bb)
将引发异常(您没有指出哪一行代码引发了异常,因此这是一个有根据的猜测)
您需要将代码修改为:
bb = loan.search(text)
if bb:
with open('z:/rodney/results.txt','a') as f:
f.write(os.path.dirname(path)+' ')
f.write(filenames[:-4]+'\n')
旁白:
循环中有语句
loan=re.compile(r'2nnn\d LOANS')
。因为它是不变的,所以不需要在循环中使用它。您可以避免使用字符串切片和一堆函数来解析文件路径,因为大多数需要的情况都已经实现了。您还可以通过将re.compile()
移出循环(创建一次并使用)来优化代码。和写入结果相同-您不需要每次都重新打开文件,只需在循环开始之前打开一次即可
优化代码:
从pathlib导入路径
进口稀土
src_dir=Path(r“Z:\rodney\020year\2020-04”)
res_fn=r“z:\rodney\results.txt”
以open(res_fn,“w+”)作为res_f:
search\u re=re.compile(r“2\sN{3}\s{28}\d\sLOANS”)
对于src_dir.iterdir()中的目录:
如果目录.is_dir():
对于目录.iterdir()中的文件:
if file.is_file():
自以下日期起打开(文件):
bb=搜索\u re.search(of.read())
如果bb:
打印(file.parent、file.stem、file=res\u f)
打印(bb.group(),file=res\u f)
#res_f.write(file.parent+“”+file.stem+“\n”+bb.group())
基于您的源代码,我对其进行了优化。
我使用os.walk
访问每个.txt文件,然后在这些txt文件中逐行读取并将其保存在枚举中。然后,我将使用正则表达式检查枚举中的每一行(我引用了olvinroghtsan)。如果有匹配项,它将为您打印出确切的文件位置和行
import os
import re
extension = [".txt"]
regex = r"2\sN{3}\s{28}\d\sLOANS"
re_Search = re.compile(regex)
path = "Z:\rodney\020year\2020-04"
for subdir, dirs, files in os.walk(path):
for file in files:
file_path = os.path.join(subdir, file)
ext = os.path.splitext(file)[-1].lower()
if ext in extension:
with open(file_path, "r") as f:
try:
f_content = f.readlines()
except Exception as e:
print(e)
for l_idx, line in enumerate(f_content):
if re_Search.search(line):
print(file_path)
print("At line: {l_idx}".format(l_idx = l_idx+1))
else:
print("Nothing!!")
谢谢-不幸的是,在更新我的代码以反映您的更改后,什么也没有发生。它没有打印文件或打印“nothing!”。代码根本没有执行…?请再次检查此模式以确保其正确与否?您可以使用记事本++来执行此操作。您的代码确实执行了-不幸的是,'results.txt'文件包含空格。。。它应该这样做吗?或者这是否意味着代码没有找到匹配项???@belewis6i,你添加的小样本数据应该与你的正则表达式匹配?