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


170

Quiero verificar si una cadena está en un archivo de texto. Si es así, haz X. Si no es así, haz Y. Sin embargo, este código siempre regresa Truepor 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"

Respuestas:


392

TrueYa se ha dado la razón por la que siempre recibiste , así que solo ofreceré 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 línea por línea):

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

Otro truco: puede aliviar los posibles problemas de memoria mediante la mmap.mmap()creación de un objeto "similar a una cadena" que utiliza el archivo subyacente (en lugar de leer todo el archivo en la memoria):

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

NOTA: en python 3, los mmaps se comportan como bytearrayobjetos en lugar de cadenas, por lo que la subsecuencia que busca find()debe ser un bytesobjeto en 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 entre mayúsculas y minúsculas:if re.search(br'(?i)blabla', s):


84
¡Esto es brillante! Esto es exactamente por qué me encanta stackoverflow: no solo te da una solución, sino que te da una mejor opción. Gracias :)
HankSmackHood

1
La segunda solución no da los mismos resultados que 'blabla' in open('example.txt').read()en mi python 2.7
xApple

1
Extraño, funciona con s.find('blabla')(verifique -1). Podría jurar que solía funcionar intambién ... Pero parece que ahora insolo funciona para personajes individuales ...
Steven

66
if 'blabla' in open('example.txt').read(): print "true"==> ¿Cómo podemos cerrar el example.txtarchivo en este caso?

44
openEn general, debe encapsularse en una withdeclaración:with open(file_name) as fl: return text in fl.read()
Ohad Schneider

27

Como dijo Jeffrey, no estás comprobando el valor de check(). Además, su check()función no devuelve nada. Tenga en cuenta 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 puede probar la salida de check():

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

22

Aquí hay otra forma de responder su pregunta usando 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 find escribe la palabra que deseas encontrar y 'file'representa tu nombre de archivo


11
if True:
    print "true"

Esto siempre sucede porque Verdadero siempre es Verdadero.

Quieres algo como esto:

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

¡Buena suerte!


Ya veo, funciona ahora. Sin embargo, me parece un poco extraño, esto significa que Python dice "un módulo es verdadero, a menos que se indique lo contrario". Entonces, si creara un módulo vacío, ¿siempre sería cierto? Interesante :)
HankSmackHood

11
No, para nada, nada que ver con los módulos. Simplemente estabas comprobando si True era cierto, y lo es.
Daniel Roseman

5

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
  • string es, por supuesto, la cadena deseada que desea encontrar y agregar a outf.

4

Su checkfunción debe devolver el foundbooleano 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 en:

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

1
Todas las respuestas anteriores son dramáticamente FALSAS excepto la suya. Pasé medio día para adivinar qué está sucediendo con la respuesta que validaron, mientras que es totalmente INCORRECTO. Solo el tuyo funcionó para mí

2

Dos problemas:

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

  2. Verdadero siempre es verdadero: no está comprobando el resultado de su 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"

2

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

Si tiene una pregunta sobre este tema que no se responde con estas preguntas y respuestas, haga una nueva pregunta en la esquina superior derecha.
Sumurai8

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"

1

Si el usuario quiere buscar la palabra en un archivo de texto dado.

 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"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.