python - 如何在所有文件中搜索字符串
问题描述
我想检查一个字符串(用户输入)是否在所有文件中。如果是,则执行 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')
解决方案
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') )
推荐阅读
- python - 为 python 安装包时出错,当我有时询问 vc++
- r - 如何使用 Prcomp 将 PCA 的摘要提取为 R 中的数据框?
- html - Ng引导模式不打开
- html - 实现引导无间隙卡片列
- qt - QTcpSocket如何返回QString
- python - 行到列 Python Pandas 数据框 (pd.melt)
- docker - Pip install 实际上是在一个 docker 容器中(气流)
- javascript - Javascript 中使用对象引用的“闭包”:“私有变量”存储在哪里?
- mysql - 在 MySQL 中计算一个复杂的累积值
- postgresql - 带有“DISTINCT ON”的“CAST”函数不会改变字段的类型