首页 > 解决方案 > 如何在所有文件中搜索字符串

问题描述

我想检查一个字符串(用户输入)是否在所有文件中。如果是,则执行 X。如果不是,则执行 Y。但是,由于某种原因,此代码始终返回 True。任何人都可以看到有什么问题吗?

import os

text = 'T'

def check(filename, text):
    with open(filename) as dataf:
        return any(text in line for line in dataf)

for filename in os.listdir(os.getcwd()):
   with open(os.path.join(os.getcwd(), filename), 'r') as file_io: # open in readonly mode
       for line in file_io:
           if check(filename, text):
               print('True')
           else:
               print('False')

标签: pythonfilesearchtext

解决方案


text当您遍历文件中的每一行时,您正在重新检查文件是否包含一遍又一遍。你可以像这样解决这个问题。

import os

text = 'T'

def check(filename, text):
    with open(filename) as dataf:
        return any(text in line for line in dataf)

for filename in os.listdir(os.getcwd()):
    if check(filename, text):
        print('True')
    else:
        print('False')

现在将通过并根据每个文件是否具有text.

但是你说你想检查一个字符串是否在所有文件中。all函数可以帮助我们解决这个问题。它会告诉我们列表是否只包含True项目。

import os

text = 'T'

def check(filename, text):
    with open(filename) as dataf:
        return any(text in line for line in dataf)

results = []
for filename in os.listdir(os.getcwd()):
    if check(filename, text):
        results.append(True)
    else:
        results.append(False)

print(all(results))

可以做得更好一点。我创建了一个名为main并缩短了将项目附加到结果列表的方式的新函数。

import os

def check(filename, search_term):
    with open(filename) as dataf:
        return any(search_term in line for line in dataf)

def main(files, search_term):
    results = []
    for filename in files:
        results.append( check(filename, search_term) )
    return all(results)

print( main(os.listdir('.'), 'T') )

但我们实际上可以把这个函数变成一个简单的单行。os.listdir也可以返回目录,所以我们要过滤掉它们。并且使用一些更好地描述我们正在做什么的函数名称,我们得到

import os

def file_contains_string(file, search_term):
    with open(file) as dataf:
        return any(search_term in line for line in dataf)

def files_all_contain_string(files, search_term):
    return all( file_contains_string(f, search_term) for f in files if os.path.isfile(f) )

print( files_all_contain_string(os.listdir('.'), 'T') )

推荐阅读