Python: busca las cadenas listadas en un archivo de otro archivo de texto?

Quiero encontrar las cadenas listadas en list.txt (una cadena por línea) en otro archivo de texto en caso de que lo encuentre imprima ‘string, one_sentence’ en caso de que no encuentre ‘string, another_sentence’. Estoy usando el siguiente código, pero está encontrando solo la última cadena en la lista de cadenas del archivo list.txt. ¿No puedes entender cual podría ser la razón?

data = open('c:/tmp/textfile.TXT').read() for x in open('c:/tmp/list.txt').readlines(): if x in data: print(x,',one_sentence') else: print(x,',another_sentence') 

Cuando lees un archivo con readlines() , los elementos de la lista resultante tienen un carácter de nueva línea final. Probablemente, estas son las razones por las que tiene menos coincidencias de las que esperaba.

En lugar de escribir

 for x in list: 

escribir

 for x in (s.strip() for s in list): 

Esto elimina los espacios en blanco iniciales y finales de las cadenas en la list . Por lo tanto, elimina los caracteres de nueva línea finales de las cadenas.

Para consolidar tu progtwig, podrías hacer algo como esto:

 with open('c:/tmp/textfile.TXT') as f: haystack = f.read() if not haystack: sys.exit("Could not read haystack data :-(") with open('c:/tmp/list.txt') as f: for needle in (line.strip() for line in f): if needle in haystack: print(needle, ',one_sentence') else: print(needle, ',another_sentence') 

No quería hacer cambios demasiado drásticos. La diferencia más importante es que estoy usando el administrador de contexto aquí a través de la instrucción with . Asegura el manejo adecuado de los archivos (principalmente el cierre) para usted. Además, las líneas de la ‘aguja’ se eliminan al vuelo utilizando una expresión de generador. El enfoque anterior lee y procesa el archivo de la aguja línea por línea en lugar de cargar todo el archivo en la memoria de una vez. Por supuesto, esto solo hace una diferencia para archivos grandes.

readlines () mantiene un carácter de nueva línea al final de cada cadena leída de su archivo de lista. Llame a la tira () en esas cadenas para eliminar esos caracteres (y cualquier otro espacio en blanco).