¿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()
3 respuestas
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)
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.
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
...
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.