devolviendo una lista de palabras después de leer un archivo en python

Tengo un archivo de texto que se llama test.txt . Quiero leerlo y devolver una lista de todas las palabras (con nuevas líneas eliminadas) del archivo.

Este es mi código actual:

 def read_words(test.txt): open_file = open(words_file, 'r') words_list =[] contents = open_file.readlines() for i in range(len(contents)): words_list.append(contents[i].strip('\n')) return words_list open_file.close() 

Ejecutar este código produce esta lista:

 ['hello there how is everything ', 'thank you all', 'again', 'thanks a lot'] 

Quiero que la lista se vea así:

 ['hello','there','how','is','everything','thank','you','all','again','thanks','a','lot'] 

Reemplace la línea words_list.append(...) en el bucle for con lo siguiente:

 words_list.extend(contents[i].split()) 

Esto dividirá cada línea en caracteres de espacio en blanco y luego agregará cada elemento de la lista resultante a la lista de words_list .

O como un método alternativo para reescribir la función completa como una lista de comprensión:

 def read_words(words_file): return [word for line in open(words_file, 'r') for word in line.split()] 

Dependiendo del tamaño del archivo, parece que sería tan fácil como:

 with open(file) as f: words = f.read().split() 

Así es como escribiría eso:

 def read_words(words_file): with open(words_file, 'r') as f: ret = [] for line in f: ret += line.split() return ret print read_words('test.txt') 

El uso de itertools puede acortar un poco la itertools , pero personalmente me parece que el resultado es menos legible:

 import itertools def read_words(words_file): with open(words_file, 'r') as f: return list(itertools.chain.from_iterable(line.split() for line in f)) print read_words('test.txt') 

Lo bueno de la segunda versión es que se puede hacer para que esté completamente basado en el generador y, por lo tanto, evite guardar todas las palabras del archivo en la memoria al mismo tiempo.

Hay varias formas de hacerlo. Aquí hay algunos:

Si no te importan las palabras repetidas :

 def getWords(filepath): with open('filepath') as f: return list(itertools.chain(line.split() for line in f)) 

Si desea devolver una lista de palabras en las que cada palabra aparece solo una vez :

Nota: esto no preserva el orden de las palabras.

 def getWords(filepath): with open('filepath') as f: return {word for word in line.split() for line in f} # python2.7 return set((word for word in line.split() for line in f)) # python 2.6 

Si desea un conjunto –y– desea conservar el orden de las palabras :

 def getWords(filepath): with open('filepath') as f: words = [] pos = {} position = itertools.count() for line in f: for word in line.split(): if word not in pos: pos[word] = position.next() words.append(word) return sorted(words, key=pos.__getitem__) 

Si quieres un diccionario de frecuencia de palabras :

 def getWords(filepath): with open('filepath') as f: return collections.Counter(itertools.chain(line.split() for line in file)) 

Espero que esta ayuda