una - funcion write python
¿Cómo buscar una cadena en archivos de texto? (9)
Aquí hay otra manera de responder posiblemente su pregunta usando la función de búsqueda que le da un valor numérico literal de donde algo realmente es
open(''file'', ''r'').read().find('''')
en find escribe la palabra que quieres encontrar y ''file''
significa tu nombre de archivo
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 devuelve True
por algún motivo. ¿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"
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
Como dijo Jeffrey Said, no estás verificando el valor del check()
. Además, su función check()
no devuelve nada. Tenga en cuenta 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()
Dos problemas:
Tu función no devuelve nada; una función que no devuelve nada explícitamente devuelve None (que es falso)
Verdadero siempre es verdadero: no está verificando 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"
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.
La función de check
debe devolver el 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 para:
if check():
print "true"
else:
print "false"
Ya se ha proporcionado la razón por la que siempre obtuviste la True
, así que solo te ofreceré otra sugerencia:
Si su archivo no es demasiado grande, puede leerlo en una cadena y simplemente usarlo (más fácil ya 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 "de cadena" que utiliza 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 bytearray
objetos en lugar de cadenas, por lo que la subsecuencia que busca con find()
tiene que ser un objeto 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 insensible a mayúsculas / minúsculas: if re.search(br''(?i)blabla'', s):
found = 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"
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!