2011-02-09 19 views
92

Quiero comprobar 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 devuelve True por algún motivo. ¿Alguien puede ver lo que está mal?¿Cómo buscar una cadena en archivos de texto?

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" 

Respuesta

226

La razón por la que siempre tiene True ya se ha dado, así que voy a ofrecer otra sugerencia:

Si el archivo no es demasiado grande, se puede leer en una cadena, y justo el uso que (más fácil y más rápida que la lectura y comprobación de línea por línea):

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

Otro truco: puede aliviar los posibles problemas de memoria mediante el uso de mmap.mmap() para crear un objeto "similar a una cuerda" que utiliza el archivo subyacente (en lugar de leer ing 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, mmaps comportarse como bytearray objetos en lugar de cadenas, por lo que la subsecuencia busca con find() tiene que ser un objeto bytes lugar de una cadena, así , p.ej. 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 es posible usar expresiones regulares en mmap por ejemplo,, Entre mayúsculas y minúsculas de búsqueda: if re.search(br'(?i)blabla', s):

+43

¡Esto es brillante! Esto es exactamente por lo que amo 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 'en open (' example.txt '). Read() 'en mi python 2.7 – xApple

+1

Extraño, funciona con' s.find (' blabla ') '(verificar por -1). Podría jurar que solía funcionar con 'in' también ... Pero ahora parece que' en' solo funciona para caracteres individuales ... – Steven

7
if True: 
    print "true" 

Esto siempre sucede porque el verdadero siempre es cierto.

quieres algo como esto:

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

Buena suerte!

+0

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 tuviera un módulo vacío, ¿siempre sería cierto? Interesante :) – HankSmackHood

+6

No, para nada, nada que ver con los módulos. Simplemente estabas comprobando si True era cierto, cuál es. –

21

Como Jeffrey Said, no está comprobando el valor de check(). Además, su función check() no devuelve nada. Nótese la diferencia:

def check(): 
     datafile = file('example.txt') 
     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 anything 


print check() 
2

Su función check debe devolver el booleano found y usarlo para determinar lo que desea 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 ser condensado a:

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

Todas las respuestas anteriores son dramáticamente FALSAS excepto la tuya. Pasé medio día para adivinar qué está sucediendo con la respuesta que validaron mientras estaba totalmente INCORRECTA. Solo el tuyo funcionó para mí –

0

encontrado = 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" 
+0

No es necesario llamar 'check()' dos veces ... – Steven

+0

typo. Gracias. fijo. – karlcow

1

dos problemas:

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

  2. verdadero es siempre verdad - usted no está mirando 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" 
11

Ésta es otra manera de responder, posiblemente, su pregunta usando la función de búsqueda que le da un valor numérico literal de que algo realmente es

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

en encontrar escribir la palabra que desea encontrar y 'file' representa el nombre del archivo

1

Cómo buscar el texto en el archivo y devuelve una ruta de archivo en el 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 
+0

Si tiene alguna pregunta sobre este tema que no haya sido respondida por este Q & A, por favor haga una nueva pregunta en la esquina superior derecha. – Sumurai8

3

me hizo 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
  • cadena es, por supuesto, la cadena deseada que desea buscar y agregar a outf.
Cuestiones relacionadas