python python-3.x file random text

Python imprime una línea aleatoria desde el archivo sin repetir



python-3.x file (6)

El problema con su código es que si encuentra una línea que ya ha mostrado, simplemente regresa y no hace nada.

Lo que puede hacer con pequeños ajustes en su código es elegir una nueva línea aleatoria hasta que encuentre una que aún no haya elegido. Esto se hace usando el bloque while :

# Variable for text file text_database = ''./text_database.txt'' #List of already chosen lines lines_list = [] # Elif instruction for random lines from file elif command == ''/random'': with open (text_database) as f: lines = f.readlines() random_tmp = random.choice(lines) #while line has been chosen already, try to chose another one while random_tmp in lines_list: random_tmp = random.choice(lines) lines_list.append(random_tmp) print(random_tmp)

Tenga en cuenta que hay algunas limitaciones a este código:

  • el bucle se ejecutará para siempre una vez que se hayan elegido todas las líneas
  • recordar las líneas de texto que se han elegido puede consumir memoria; en cambio, puede recordar los índices de las líneas que ha elegido.

Tengo un pequeño programa que imprime líneas aleatorias de un archivo de texto. Quiero guardar las líneas ya elegidas en una lista u otra cosa, para que no se repita la próxima vez.

Ejemplo

text_database.txt

  1. Esta es una linea
  2. Esta es otra linea
  3. Esta es una línea de prueba
  4. Eso apesta

Este es un ejemplo para mostrar que la salida es aleatoria y el programa repite líneas; no es la salida directa en el terminal:

This is a line That sucks That sucks That sucks This is a line

Mi código:

# Variable for text file text_database = ''./text_database.txt'' ... with open (text_database) as f: lines = f.readlines() print(random.choice(lines))

Lo que probé:

with open (text_database) as f: lines_list = [] lines = f.readlines() random_tmp = random.choice(lines) if random_tmp not in lines_list: lines_list.append(random_tmp) print(random_tmp)

No funciona y necesito ayuda. Gracias chicos.


Esta es una solución REALMENTE desordenada, pero lo he probado de antemano

f = open(text_database, "r") list = [] list_of_nums = [] for i in f: list.append(i) elif command == ''/random'': randomNum = random.randint(0, len(list) - 1) def reRun(): global randomNum for i in list_of_nums: if randomNum == i: randomNum = random.randint(0, len(list) - 1) reRun() reRun() list_of_nums.append(randomNum) print(list[randomNum])

Lo que este código deos es ir a través de todas las líneas en f y ponerlas en una lista. entonces elige un número aleatorio entre 0 y la longitud de la lista e imprime una línea aleatoria correspondiente a ese número

¡Espero que esto ayude! Y bienvenido a apilar el desbordamiento


Hola, esto es un poco menos desordenado y tiene todas las características que solicitaste

f = open(text_database, "r") list = [] for i in f: list.append(i) elif command == ''/random'': random.shuffle(list) for i in list: print(i)

Esto obtiene todas las líneas en el archivo y las baraja usando pitones construidas al random.shuffle No hay posibilidad de que las líneas se repitan y es bastante eficiente.


pruebe esta solución, imprime solo una línea aleatoria cada vez

import random text_database = ''./text_database.txt'' lines_list = [] with open (text_database) as f: lines = f.readlines() lines_list.append(lines) for item in lines_list: rand_item = item[random.randrange(len(item))] print(rand_item)


elif command == ''/random'': with open (text_database) as f: lines = f.readlines() while len(lines)>0: max_int = len(lines)-1 #update the len each loop as we remove one each time print(lines.pop(random.randint(0, max_int))) #pop a random value from the list


from random import sample file_name = "text_database.txt" lines = open(file_name, "r").read().splitlines() for line in sample(lines, k=len(lines)): print(line)

Uso .read().splitlines() lugar de .readlines() para purgar el espacio en blanco final (nuevas líneas) de cada línea. También podría haber hecho:

lines = [line.rstrip("/n") for line in open(file_name, "r")]

Aquí hay una descripción de random.sample de la documentación:

Devuelve una lista de una longitud de elementos únicos elegidos de la secuencia de población. Utilizado para muestreo aleatorio sin reemplazo.

Alternativamente, podría haber barajado su lista de líneas y luego iterar sobre ellas.

EDITAR - Creo que lo entiendo ahora. ¿Cómo es esto?

def main(): from random import shuffle file_name = "text_database.txt" lines = open(file_name, "r").read().splitlines() shuffle(lines) sentinel = object() def command_random(): try: line = lines.pop() except IndexError: print("There are no more lines in the file!") else: print(line) def command_quit(): nonlocal sentinel sentinel = None commands = { "random": command_random, "quit": command_quit } while sentinel is not None: user_input = input("Please enter a command: ") command = commands.get(user_input) if command is None: continue command() return 0 if __name__ == "__main__": import sys sys.exit(main())