Si no sabe de antemano qué archivos hay, tendrá que obtener una lista, luego simplemente elija un índice al azar en la lista.
Aquí hay una tentativa:
import os
import random
def getRandomFile(path):
"""
Returns a random filename, chosen among the files of the given path.
"""
files = os.listdir(path)
index = random.randrange(0, len(files))
return files[index]
EDITAR: La pregunta ahora menciona un temor a una "condición de carrera", que sólo puedo asumir que está siendo añadido/borrado mientras está el problema típico de los archivos en el proceso de tratar de elegir un archivo aleatorio.
No creo que haya una forma de evitarlo, aparte de tener en cuenta que cualquier operación de E/S es inherentemente "insegura", es decir, puede fallar. Por lo tanto, el algoritmo para abrir un archivo elegido al azar en un determinado directorio debe:
- En realidad
open()
el archivo seleccionado, y manejar un fracaso, ya que el archivo ya no podría estar allí
- Probablemente se limita a un conjunto número de intentos, por lo que no muere si el directorio está vacío o si ninguno de los archivos son legibles
Lo siento chicos, presenté accidentalmente antes de que terminara de entrar en mi pregunta. No debería cambiar mucho sin embargo. – JasonSmith
¿Podría aclarar el problema de la condición de carrera? Supongo que te refieres a seleccionar y abrir un archivo sin una ventana intermedia (cuando alguien podría eliminarlo entre elegir e intentar abrirlo, por ejemplo), pero valdría la pena indicarlo explícitamente (suponiendo que te estoy interpretando correctamente).) – Brian
¿Es la condición de carrera porque varios procesos lo harán al mismo tiempo? ¿O la condición de carrera ocurrirá porque hay un escritor que crea archivos y este lector que los está seleccionando? –