Eligiendo Elementos de una Lista

Imaginemos que queremos personalizar el fichero de entrada al sistema /etc/motd con frases de consejos para los usuarios que se conecten, pero que no queremos usar el programa fortune porque nos hemos cansado de la falsa aleatoriedad de los mensajes y que siempre acaban saliendo los mismos. Vamos a ver como solucionar esto con nuestro propio sistema.

Vamos a escribir un pequeño script de Python que elegirá una de las frases de un fichero y la escribirá en el /etc/motd, borrara esa frase del fichero original para no tener que verla nunca más.

La cabezera estandard.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

Importamos los módulos necesarios

import os,random

Definimos los fichero de entrada y salida así como la lista que almacenara las frases.

input = 'input.txt'
output = 'output.txt'
lista = []

Empezamos a recorrer el script y lo primero que hacemos es comprobar que el fichero no esta vacío. Si lo está, damos un error y salimos. En caso contrario rellenamos la lista con las frases.

f = open (input, "r")
if os.stat(input)[6] == 0:
  print "Fichero vacío"
  exit (2)
else:
  for line in f:
    lista.append (line.strip())
f.close

Elegimos un elemento de la lista al azar y lo escribimos en el fichero de salida.

total = len (lista)
elegida = random.randint(0,total - 1) # Python como C y casi todos cuenta desde 0
f = open (output, "w")
f.write ("%s\n" % lista[elegida])
f.close

Eliminamos ese elemento para que no vuelva a salir.

lista.remove (lista[elegida])

Guardamos la nueva lista

f = open (input, "w")
for item in lista:
  f.write ("%s\n" % item)
f.close

Para ejecutarlo, simplemente le damos un nombre y permiso de ejecución. Conforme alimentemos el fichero de entrada iran apareciendo frases distintas en el fichero de salida. Si el fichero de entrada se vacia, el de salida guardará la última frase que se introdujo. Esto último se puede cambiar.

Como bien comenta nuestro amigo el Informático de Guardia, el problema puede ser resulto en un sola línea haciendo simplemente:

cat input.txt | sort -R | head -n 1 > output.txt

Aunque está solución si saca frases repetidas al no ir eliminado las que ya han sido elegidas, además si el fichero de entrada está vacío el de salida se vacía. Pero sólo necesitamos poner un par de líneas más.

2 Comments.

  1. Interesante ejercicio compi pero, personalmente me plantearía el uso de Bash y el comando sort (el parámetro -R hace milagros y permite obtener líneas aleatorias)

    Conseguiríamos resolver el problema con una única línea de código 😉

    Un abrazo

  2. Es correcto colega, pero la cosa era hacerlo con Python por cambiar y aprender 🙂
    Voy a pasar tu propuesta a la entrada porque también es interesante resolver cosas en una sola linea.
    Un saludo y gracias por el aporte.