¿Puede alguien explicarme por qué mi declaración de búsqueda condicional está devolviendo ambos resultados (encuentra la cadena e imprime los resultados en la pantalla e imprime "Cadena no encontrada"). He realizado cambios, pero debo pasar por alto algo.

Código:

 if choice == '1':
         regex2  = re.compile(r'\s+')
         for root,dirname, files in os.walk(directory):
             for file2 in files:
                 if file2.endswith(".log") or file2.endswith(".txt"):
                    f=open(os.path.join(root, file2))
                    for i,line in enumerate(f.readlines()):
                        result2 = regex.search(re.sub(regex2, '',line))
                        if result2:
                           ln = str(i)
                           print "\nLine: " + ln
                           print "File: " + os.path.join(root,file2)
                           print "String Type: " + result2.group() + '\n'
                           temp.write('\nLine:' + ln + '\nString:' + result2.group() + '\nFile: ' + os.path.join(root,file2) + '\n')

                    else:
                       print "String not found!!!"
                    break  
                    f.close()    
         re.purge()
0
suffa 17 jun. 2011 a las 19:27

3 respuestas

La mejor respuesta

La cláusula else para un bucle for se ejecuta si el bucle sale porque el iterable sobre el que itera está agotado, en lugar de debido a una declaración break. Como su ciclo no incluye ninguna break, la cláusula else siempre se ejecutará.

Aquí hay un intento de refactorizar su código. Utiliza una función de generador para generar la lista de nombres de archivo y el módulo fileinput para encargarse de abrir y cerrar los archivos. Su bacalao nunca cierra explícitamente ningún archivo debido a break inmediatamente antes de f.close().

def walk_dir(directory, extensions=""):
    for path, dirs, files in os.walk(directory):
        for name in files:
            if name.endswith(extensions):
                yield os.path.join(path, name)

whitespace  = re.compile(r'\s+')
for line in fileinput.input(walk_dir(directory, (".log", ".txt"))):
    result = regex.search(whitespace.sub('', line))
    if result:
        template = "\nLine: {0}\nFile: {1}\nString Type: {2}\n\n"
        output = template.format(fileinput.filelineno(),
                                 fileinput.filename(),
                                 result.group())
        print output
        temp.write(output)
1
Sven Marnach 17 jun. 2011 a las 16:46

Refactorice un poco su código: hay demasiadas sangrías y estructuras de control de mezcla. Será más fácil detectar y corregir el problema de esta manera.

Por ejemplo, divida el ciclo en recorrido y verificación:

def look_through(directory):
    found = 0
    for root, dirname, files in os.walk(directory):
        for filename in files:
            result = process_file(root, filename)
            if result is not None:
                found += 1
                yield result
    if found == 0:
        print 'blah, not found'

def process_file(...

¿Ves el problema con el código anterior ahora? Cualquier condición solo se verificó por archivo y luego nuevamente por directorio. No hubo un contador global de resultados, ni se registró el estado de búsqueda.

1
viraptor 17 jun. 2011 a las 16:21

Tienes un problema de sangría que creo que quieres:

...
for i,line in enumerate(f.readlines()):
    result2 = regex.search(re.sub(regex2, '',line))
    if result2:
        ln = str(i)
        print "\nLine: " + ln
        print "File: " + os.path.join(root,file2)
        print "String Type: " + result2.group() + '\n'
        temp.write('\nLine:' + ln + '\nString:' + result2.group() + '\nFile: ' + os.path.join(root,file2) + '\n')

    else:  # <<<<<<<<<<<<<<<<<<<< HERE !!!!
        print "String not found!!!"
break
...
3
mouad 17 jun. 2011 a las 15:30