Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python正则表达式搜索文件并返回文件名_Python_Regex_File - Fatal编程技术网

使用Python正则表达式搜索文件并返回文件名

使用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

请帮忙。 我正在几个目录中搜索几个.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+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,你添加的小样本数据应该与你的正则表达式匹配?