¿Cómo buscar una cadena en archivos de texto?

Quiero comprobar si una cadena está en un archivo de texto. Si es así, haga X. Si no lo es, haga Y. Sin embargo, este código siempre devuelve True por alguna razón. ¿Alguien puede ver lo que está mal?

 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" 

La razón por la que siempre obtuviste la True ya se ha dado, por lo que te ofrezco otra sugerencia:

Si su archivo no es demasiado grande, puede leerlo en una cadena y simplemente usarlo (más fácil y, a menudo, más rápido que leer y verificar la línea por línea):

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

Otro truco: puede aliviar los posibles problemas de memoria utilizando mmap.mmap() para crear un objeto “similar a una cadena” que usa el archivo subyacente (en lugar de leer todo el archivo en la memoria):

 import mmap f = open('example.txt') s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) if s.find('blabla') != -1: print('true') 

NOTA: en Python 3, los mmaps se comportan como objetos bytearray lugar de cadenas, por lo que la subsecuencia que busca con find() tiene que ser un objeto de bytes lugar de una cadena, por ejemplo. 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') 

También puede usar expresiones regulares en mmap , por ejemplo, búsqueda sin distinción de mayúsculas y minúsculas: if re.search(br'(?i)blabla', s):

Como dijo Jeffrey, no está verificando el valor del check() . Además, su función check() no está devolviendo nada. Note la diferencia:

 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 

Luego puedes probar la salida de check() :

 if check(): print('True') else: print('False') 

Aquí hay otra forma de responder a su pregunta utilizando la función de búsqueda que le da un valor numérico literal de dónde está realmente algo.

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

en buscar, escriba la palabra que desea buscar y 'file' significa su nombre de archivo

 if True: print "true" 

Esto siempre sucede porque la Verdad es siempre la Verdad.

Quieres algo como esto:

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

¡Buena suerte!

La función de check debe devolver el valor booleano found y usarlo para determinar qué 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" 

El segundo bloque también podría condensarse a:

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

Hice una pequeña función para este propósito. Busca una palabra en el archivo de entrada y luego la agrega al archivo de salida.

 def searcher(outf, inf, string): with open(outf, 'a') as f1: if string in open(inf).read(): f1.write(string) 
  • outf es el archivo de salida
  • inf es el archivo de entrada
  • la cadena es, por supuesto, la cadena que desea encontrar y agregar a outf.

Cómo buscar el texto en el archivo y devuelve una ruta de archivo en la que se encuentra la palabra

 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 

En 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 

Dos problemas:

  1. Tu función no devuelve nada; una función que no devuelve explícitamente nada devuelve None (que es falsy)

  2. Verdadero es siempre verdadero, no estás verificando el resultado de tu función

.

 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" 

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"