Estoy escribiendo una GUI que generará nombres aleatorios para tabernas para algunos juegos de mesa. Tengo documentos .txt que tienen algo como esto.

Red
Green
Yellow
Resting
Young

Y

King
Dragon
Horse
Salmon

Estoy leyendo y uniéndolos al azar usando el siguiente

x = 1
tavern1 = open('tavnames1.txt', 'r')
name1 = tavern1.readlines()
tav1 = random.sample(name1, int(x))
tav1 = str(tav1)
tav1 =tav1.strip()
tav1 =tav1.replace('\n', '')


tavern2 = open('tavnames2.txt', 'r')
name2 = tavern2.readlines()
tav2 = random.sample(name2, int(x))
tav2 = str(tav2)


TavernName = 'The' + tav1 + tav2


print(TavernName)

La salida que obtengo se verá algo así como

The['Young\n']['Salmon\n']

Intenté usar .replace () y .strip () en la cadena pero no parece funcionar.

¿Alguna idea?

Salud.

0
user1630350 2 ene. 2017 a las 12:35
Tome el primer valor de tav1 y tav2, haciendo tav1[0].strip(). El .strip() se encarga del \n.
 – 
Mathias711
2 ene. 2017 a las 12:37
Lo siento, no soy demasiado fluido en Python, ¿puede explicar un poco más por favor?
 – 
user1630350
2 ene. 2017 a las 12:38
sample() siempre devuelve la lista, incluso si tiene un elemento, por lo que tav1 y tav2 son listas y usa str() para convertirlo en texto. Utilice tav1 = tav1[0] o random.choice(name1) para obtener solo un elemento.
 – 
furas
2 ene. 2017 a las 12:40

3 respuestas

sample() siempre devuelve una lista, incluso si hay un elemento. Y usa str() para convertir la lista en una cadena para que Python agregue [ ], y strip() no funciona porque \n no está al final de la cadena.

Pero puede usar random.choice() que devuelve solo un elemento, por lo que no tiene que convertir a una cadena y no obtiene [ ]. Y luego puede usar strip() para eliminar \n

tavern1 = open('tavnames1.txt')
name1 = tavern1.readlines()
tav1 = random.choice(name1).strip()

tavern2 = open('tavnames2.txt')
name2 = tavern2.readlines()
tav2 = random.choice(name2).strip()

tavern_name = 'The {} {}'.format(tav1, tav2)

print(tavern_name)
3
furas 2 ene. 2017 a las 12:47

Una forma de deshacerse de las nuevas líneas es leer todo el archivo y usar splitlines(): (ver Leer un archivo sin nuevas líneas)

tavern1 = open('tavnames1.txt', 'r')
name1 = tavern1.read().splitlines()

Para elegir un elemento aleatorio de la lista name1 puede usar tav1 = random.choice(name1) (consulte https://docs.python.org/3.6/library/random.html#random.choice).

3
Community 23 may. 2017 a las 15:16

Tome el primer valor de tav1 y tav2, haciendo tav1[0].strip(). El .strip() se encarga del \n.

Al tomar un random.sample, obtienes una lista de valores. Debido a que toma solo una muestra, obtiene una lista con solo un elemento, en su ejemplo "Joven". Pero está en una lista, por lo que se parece más a ["Young"]. Para acceder solo a "Young", tome el primer (y único) elemento de la lista, diciendo tav1[0].

0
Mathias711 2 ene. 2017 a las 12:43
También puede usar random.choice(your_list) para obtener un solo elemento aleatorio de la lista
 – 
Guillaume
2 ene. 2017 a las 12:48
Ahh, ahora lo entiendo. ¡Gracias por eso! Esto funcionó de maravilla
 – 
user1630350
2 ene. 2017 a las 12:51