Answers:
您一直得到的原因True
已经给出,因此我只提供另一个建议:
如果文件不是太大,则可以将其读取为字符串,然后使用它(比读取和检查每行更容易,并且通常更快):
with open('example.txt') as f:
if 'blabla' in f.read():
print("true")
另一个技巧:通过使用mmap.mmap()
创建使用基础文件的“字符串状”对象(而不是读取内存中的整个文件),可以减轻可能的内存问题:
import mmap
with open('example.txt') as f:
s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
if s.find('blabla') != -1:
print('true')
注意:在python 3中,mmap的行为类似于bytearray
对象而不是字符串,因此,例如,查找的子序列也find()
必须是bytes
对象而不是字符串。s.find(b'blabla')
:
#!/usr/bin/env python3
import mmap
with open('example.txt', 'rb', 0) as file, \
mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as s:
if s.find(b'blabla') != -1:
print('true')
您还可以在mmap
不区分大小写的搜索中使用正则表达式:if re.search(br'(?i)blabla', s):
'blabla' in open('example.txt').read()
我的python 2.7
s.find('blabla')
(检查-1)。我可以发誓它也可以使用in
...但是现在看来,它in
仅适用于单个字符...
open
通常应该用以下with
语句封装:with open(file_name) as fl: return text in fl.read()
如Jeffrey Said所述,您没有检查的值check()
。此外,您的check()
函数未返回任何内容。注意区别:
def check():
with open('example.txt') as f:
datafile = f.readlines()
found = False # This isn't really necessary
for line in datafile:
if blabla in line:
# found = True # Not necessary
return True
return False # Because you finished the search without finding
然后,您可以测试的输出check()
:
if check():
print('True')
else:
print('False')
if True:
print "true"
这总是发生,因为True始终为True。
您想要这样的东西:
if check():
print "true"
else:
print "false"
祝好运!
您的check
函数应返回found
布尔值,并使用该值确定要打印的内容。
def check():
datafile = file('example.txt')
found = False
for line in datafile:
if blabla in line:
found = True
break
return found
found = check()
if found:
print "true"
else:
print "false"
第二块也可以浓缩为:
if check():
print "true"
else:
print "false"
如何在文件中搜索文本并返回在其中找到单词的文件路径。
import os
import re
class Searcher:
def __init__(self, path, query):
self.path = path
if self.path[-1] != '/':
self.path += '/'
self.path = self.path.replace('/', '\\')
self.query = query
self.searched = {}
def find(self):
for root, dirs, files in os.walk( self.path ):
for file in files:
if re.match(r'.*?\.txt$', file) is not None:
if root[-1] != '\\':
root += '\\'
f = open(root + file, 'rt')
txt = f.read()
f.close()
count = len( re.findall( self.query, txt ) )
if count > 0:
self.searched[root + file] = count
def getResults(self):
return self.searched
在Main()中
# -*- coding: UTF-8 -*-
import sys
from search import Searcher
path = 'c:\\temp\\'
search = 'search string'
if __name__ == '__main__':
if len(sys.argv) == 3:
# создаем объект поисковика и передаем ему аргументы
Search = Searcher(sys.argv[1], sys.argv[2])
else:
Search = Searcher(path, search)
# начать поиск
Search.find()
# получаем результат
results = Search.getResults()
# выводим результат
print 'Found ', len(results), ' files:'
for file, count in results.items():
print 'File: ', file, ' Found entries:' , count