Как искать строку в текстовых файлах?

170

Я хочу проверить, есть ли строка в текстовом файле. Если это так, выполните 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"
HankSmackHood
источник

Ответы:

392

Причина, по которой вы всегда получаете 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):

Стивен
источник
84
Это великолепно! Именно поэтому я люблю stackoverflow: он не просто дает вам решение, он дает вам лучший вариант. Спасибо :)
HankSmackHood
1
Второе решение не дает таких же результатов, как 'blabla' in open('example.txt').read()в моем Python 2.7
xApple
1
Странно, он работает с s.find('blabla')(проверьте -1). Я мог бы поклясться, что раньше он inтоже работал ... Но теперь кажется, что это inработает только для отдельных персонажей ...
Стивен
6
if 'blabla' in open('example.txt').read(): print "true"==> Как мы можем закрыть example.txtфайл в этом случае?
4
openв общем случае следует заключить в withутверждение:with open(file_name) as fl: return text in fl.read()
Охад Шнайдер
27

Как сказал Джеффри, вы не проверяете ценность 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')
amccormack
источник
22

Вот еще один способ ответить на ваш вопрос, используя функцию поиска, которая дает буквальное числовое значение того, где что-то действительно есть.

open('file', 'r').read().find('')

в поиске напишите слово, которое вы хотите найти, и 'file'означает ваше имя файла

amitnaruto
источник
11
if True:
    print "true"

Это всегда происходит, потому что Истина всегда Истина.

Вы хотите что-то вроде этого:

if check():
    print "true"
else:
    print "false"

Удачи!

Джеффри Гринхем
источник
Я вижу, это работает сейчас. Хотя мне это кажется немного странным, это означает, что Python говорит, что «модуль является True, если не указано иное». Так что, если бы я сделал пустой модуль, это всегда было бы правдой? Интересно :)
HankSmackHood
11
Нет, совсем нет - ничего общего с модулями. Вы просто проверяли, было ли True истинным, и это правда.
Даниэль Роузман
5

Я сделал небольшую функцию для этой цели. Он ищет слово во входном файле и затем добавляет его в выходной файл.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf - выходной файл
  • inf - входной файл
  • Строка, конечно, желаемая строка, которую вы хотите найти и добавить в outf.
кокос
источник
4

Ваша 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"
Сэм Долан
источник
1
Все приведенные выше ответы являются ЛОЖНЫМИ, кроме ваших. Я потратил полдня, чтобы угадать, что происходит с ответом, который они подтвердили, пока он полностью НЕПРАВИЛЬНЫЙ. У меня работала только твоя
2

Две проблемы:

  1. Ваша функция ничего не возвращает; функция, которая явно не возвращает ничего, возвращает None (что неверно)

  2. 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"
Хью Ботвелл
источник
2

Как найти текст в файле и вернуть путь к файлу, в котором найдено слово.

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
Хоакин
источник
Если у вас есть вопрос по этой теме, на который нет ответов на эти вопросы, пожалуйста, задайте новый вопрос в правом верхнем углу.
Sumurai8
1

найдено = ложно

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"
karlcow
источник
1

Если пользователь хочет найти слово в данном текстовом файле.

 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)
Харшан Говда
источник
0
found = False
def check():
datafile = file('example.txt')
for line in datafile:
    if "blabla" in line:
        found = True
        break
return found

if check():
    print "found"
else:
    print "not found"
Брух
источник