Como procurar uma string em arquivos de texto?

169

Quero verificar se uma string está em um arquivo de texto. Se for, faça X. Se não for, faça Y. No entanto, esse código sempre retorna Truepor algum motivo. Alguém pode ver o que está errado?

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
fonte

Respostas:

391

A razão pela qual você sempre recebeu Truejá foi apresentada, então vou oferecer outra sugestão:

Se o seu arquivo não for muito grande, você poderá lê-lo em uma string e apenas usá-lo (mais fácil e frequentemente mais rápido do que ler e verificar linha por linha):

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

Outro truque: você pode aliviar os possíveis problemas de memória usando mmap.mmap()para criar um objeto "semelhante a uma string" que usa o arquivo subjacente (em vez de ler o arquivo inteiro na memória):

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')

OBSERVAÇÃO: no python 3, os mmaps se comportam como bytearrayobjetos, e não como strings; portanto, a subsequência que você procura find()deve ser um bytesobjeto e não uma string também, por exemplo. 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')

Você também pode usar expressões regulares em mmap, por exemplo, pesquisa sem distinção entre maiúsculas e minúsculas:if re.search(br'(?i)blabla', s):

Steven
fonte
84
Isto é brilhante! É exatamente por isso que eu amo o stackoverflow: não apenas fornece uma solução, mas uma opção melhor. Obrigado :)
HankSmackHood
1
A segunda solução não apresenta os mesmos resultados que 'blabla' in open('example.txt').read()no meu python 2.7
xApple
1
Estranho, ele funciona com s.find('blabla')(verifique -1). Eu poderia jurar que costumava trabalhar intambém ... Mas agora parece que insó funciona para personagens únicos ...
Steven
6
if 'blabla' in open('example.txt').read(): print "true"==> Como podemos fechar o example.txtarquivo neste caso?
4
opengeralmente deve ser encapsulado em uma withdeclaração:with open(file_name) as fl: return text in fl.read()
Ohad Schneider
27

Como Jeffrey Said, você não está verificando o valor de check(). Além disso, sua check()função não está retornando nada. Observe a diferença:

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

Então você pode testar a saída de check():

if check():
    print('True')
else:
    print('False')
amccormack
fonte
22

Aqui está outra maneira de responder à sua pergunta usando a função find, que fornece um valor numérico literal de onde algo realmente está

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

em encontrar, escreva a palavra que deseja encontrar e 'file'significa o nome do seu arquivo

amitnaruto
fonte
11
if True:
    print "true"

Isso sempre acontece porque True é sempre True.

Você quer algo assim:

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

Boa sorte!

Jeffrey Greenham
fonte
Entendo, funciona agora. Parece um pouco estranho para mim, porém, isso significa que o Python diz "um módulo é True, a menos que seja especificado o contrário". Então, se eu fizesse um módulo vazio, sempre seria verdade? Interessante :)
HankSmackHood
11
Não, de jeito nenhum - nada a ver com módulos. Você estava simplesmente verificando se True era verdadeiro, o que é.
Daniel Roseman
5

Eu fiz uma pequena função para esse fim. Ele procura uma palavra no arquivo de entrada e a adiciona ao arquivo de saída.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf é o arquivo de saída
  • inf é o arquivo de entrada
  • string é, obviamente, a string desejada que você deseja encontrar e adicionar ao outf.
Coco
fonte
4

Sua checkfunção deve retornar o foundbooleano e usá-lo para determinar o que imprimir.

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"

o segundo bloco também pode ser condensado para:

if check():
    print "true"
else:
    print "false"
Sam Dolan
fonte
1
Todas as respostas acima são dramaticamente FALSE, exceto a sua. Passei meio dia para adivinhar o que está acontecendo com a resposta que eles validaram, enquanto está totalmente errado. Apenas o seu funcionou para mim
2

Dois problemas:

  1. Sua função não retorna nada; uma função que não retorna explicitamente nada retorna None (que é falso)

  2. True é sempre True - você não está verificando o resultado da sua função

.

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"
Hugh Bothwell
fonte
2

Como pesquisar o texto no arquivo e Retorna um caminho de arquivo no qual a palavra é encontrada (Clique para obter mais informações)

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

Principal ()

# -*- 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
joaquin
fonte
Se você tiver alguma dúvida sobre este tópico que não tenha sido respondida por estas perguntas e respostas, faça uma nova pergunta no canto superior direito.
precisa saber é o seguinte
1

encontrado = Falso

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
fonte
1

Se o usuário quiser procurar a palavra no arquivo de texto fornecido.

 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)
Harshan Gowda
fonte
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"
bruh
fonte