Как искать строку в текстовых файлах? - PullRequest
130 голосов
/ 09 февраля 2011

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

Ответы [ 10 ]

314 голосов
/ 09 февраля 2011

Причина, по которой вы всегда получали True, уже указана, поэтому я просто предложу другое предложение:

Если ваш файл не слишком большой, вы можете прочитать его в строку, и простоиспользуйте это (проще и часто быстрее, чем чтение и проверка строки в строке):

if 'blabla' in open('example.txt').read():
    print("true")

Еще один прием: вы можете устранить возможные проблемы с памятью, используя mmap.mmap() для создания "строковый "объект", который использует базовый файл (вместо чтения всего файла в памяти):

import mmap

f = open('example.txt')
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):

26 голосов
/ 09 февраля 2011

Как и Джеффри Саид, вы не проверяете значение 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')
16 голосов
/ 26 ноября 2012

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

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

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

12 голосов
/ 09 февраля 2011
if True:
    print "true"

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

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

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

Удачи!

4 голосов
/ 01 мая 2015

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

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

Ваша функция 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"
2 голосов
/ 23 августа 2013

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

.
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

In 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
1 голос
/ 18 мая 2019

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

fopen = open ('logfile.txt', mode = 'r +')

fread = fopen.readlines ()

x = input ("Введите строку поиска:")

для строки в треде:

  if x in line:

      print(line)
1 голос
/ 09 февраля 2011

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

  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"
1 голос
/ 09 февраля 2011

найдено = 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...