2009-05-17 18 views
23

Tengo un archivo de texto simple con varios miles de palabras, cada una en su propia línea, p. Ej.Python: cargar palabras del archivo en un conjunto

aardvark 
hello 
piper 

uso el siguiente código para cargar las palabras en un conjunto (Necesito la lista de palabras para probar la pertenencia, por lo que establecer es la estructura de datos Elegí):

my_set = set(open('filename.txt')) 

El código anterior produce un conjunto con las siguientes entradas (cada palabra es seguida por un espacio y una nueva línea de caracteres:?

("aardvark \n", "hello \n", "piper \n") 

¿Cuál es la forma más sencilla de cargar el archivo en un conjunto, pero deshacerse del espacio y \ n

Gracias

Respuesta

38

El método de la tira() de cadenas elimina los espacios en blanco desde ambos extremos.

set(line.strip() for line in open('filename.txt')) 
+4

Esto es superior a la solución establecida si tiene un archivo grande, porque map cargará todo el archivo en la memoria como una lista de líneas, que luego serán descartadas (itertools.imap puede arreglar eso, sin embargo). –

+1

@Ryan: eso es cierto para Python <= 2.6, pero en 3.0 map devuelve un generador. – Stephan202

+0

@RyanGinstrom Disculpa por llegar tan tarde, ¡pero no pude evitar hacerte esta pregunta! Yo había observado que 'print'' my_set [0] 'seguiría imprimiendo' aardvark'. ¿Movió el cursor a la siguiente línea después de imprimir? Corrígeme si me equivoco, pero ¿cómo sucede esto? (Python 27) ¡Gracias! –

4
my_set = set(map(str.strip, open('filename.txt'))) 
+0

Esta solución eliminará correctamente cualquier espacio y caracteres de nueva línea al aplicar el método str.strip a cada línea de nombre de archivo.txt – Wesley

1

Para eliminar solo los espacios de la derecha.

set(map(str.rstrip, open('filename.txt'))) 
+0

Si el tamaño del archivo era bastante grande, este método sería potencialmente más rápido. Evita una comparación adicional con isspace() en el lado izquierdo de cada cadena. –

+0

Sí, el autor solo especificó espacios en el lado derecho, por lo que tenía sentido hacer rstrip en lugar de tirar o dividir. – Unknown

12

Sólo tiene que cargar todos los datos del archivo, que se dividió, se hará cargo de una palabra por línea o varias palabras por línea, separados por espacios, también será más rápido para cargar todo el archivo a la vez a menos que el archivo está en GB

words = set(open('filename.txt').read().split()) 
+0

Entonces, ¿esto funcionaría si tengo una palabra por línea y también si tengo varias palabras por línea? (suponiendo que tengo una línea como "hola adiós" quiero que "hola" y "adiós" sean dos palabras separadas en el conjunto) –

+0

sí, básicamente se dividirá en espacio, nuevas pestañas de línea, etc. para que pueda tener todas las palabras en línea simple o en línea múltiple o mixta –

+0

y no se preocupe abt cargando todo el archivo en la memoria a menos que tenga un archivo muy grande que dudo pocos MBs es perfecto y este será el más rápido –

0
with open("filename.txt") as f: 
    mySet = map(str.rstrip, f) 

Si desea utilizar esto en Python 2.5, necesita

from __future__ import with_statement 
+0

Creo que aquí tiene sintaxis error: conjunto (mapa (str.rstrip ('\ n') str, f) – mtasic85

+0

Gracias por captar eso, lo he corregido. –

1
with open("filename.txt") as f: 
    s = set([line.rstrip('\n') for line in f]) 
+0

no necesita comprensión de lista allí – SilentGhost

Cuestiones relacionadas