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




python-3.x file (4)

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.


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.

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


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






text