Как искать строку в текстовых файлах?
Я хочу проверить, находится ли строка в текстовом файле. Если это так, сделайте X. Если это не так, сделайте Y. Однако этот код всегда возвращает True
по какой-либо причине. Кто-нибудь может понять, что не так?
def check():
datafile = file('example.txt')
found = False
for line in datafile:
if blabla in line:
found = True
break
check()
if True:
print "true"
else:
print "false"
Ответы
Ответ 1
Причина, по которой вы всегда получали 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 mmaps ведут себя как объекты 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):
Ответ 2
Как сказал Джеффри Саид, вы не проверяете значение 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')
Ответ 3
Здесь еще один способ ответить на ваш вопрос, используя функцию find, которая дает вам буквальное числовое значение, где что-то действительно есть
open('file', 'r').read().find('')
в поиске напишите слово, которое вы хотите найти
и 'file'
означает ваше имя файла
Ответ 4
if True:
print "true"
Это всегда происходит потому, что True всегда прав.
Вы хотите что-то вроде этого:
if check():
print "true"
else:
print "false"
Удачи!
Ответ 5
Ваша функция 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"
Ответ 6
Я сделал небольшую функцию для этой цели. Он ищет слово во входном файле и затем добавляет его в выходной файл.
def searcher(outf, inf, string):
with open(outf, 'a') as f1:
if string in open(inf).read():
f1.write(string)
- outf - это выходной файл
- inf - это входной файл
Строка
- - это, конечно, искомая строка, которую вы хотите найти и добавить в outf.
Ответ 7
Две проблемы:
-
Ваша функция ничего не возвращает; функция, которая явно не возвращает ничего, возвращает None (что является ложным)
-
True всегда True - вы не проверяете результат своей функции
.
def check(fname, txt):
with open(fname) as dataf:
return any(txt in line for line in dataf)
if check('example.txt', 'blabla'):
print "true"
else:
print "false"
Ответ 8
Как искать текст в файле и возвращает путь к файлу, в котором находится слово
(Как искать часть текста в файле и возвращять путь к файлу в котором это слово найдено)
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
В главном()
# -*- 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
Ответ 9
found = False
def check():
datafile = file('example.txt')
for line in datafile:
if blabla in line:
found = True
break
return found
if check():
print "true"
else:
print "false"
Ответ 10
Если пользователь хочет найти слово в данном текстовом файле.
fopen = open('logfile.txt',mode='r+')
fread = fopen.readlines()
x = input("Enter the search string: ")
for line in fread:
if x in line:
print(line)