¿Hay un método incorporado para hacerlo? Si no, ¿cómo puedo hacer esto sin que me cueste demasiado?¿Cómo leo una línea aleatoria de un archivo en Python?
Respuesta
No incorporado, pero algoritmo R(3.4.2)
(Waterman "Reservoir Algoritmo") de Knuth de "The Art of Computer Programming" es bueno (en una versión muy simplificada):
import random
def random_line(afile):
line = next(afile)
for num, aline in enumerate(afile):
if random.randrange(num + 2): continue
line = aline
return line
El num + 2
produce la secuencia 2, 3, 4 ... El randrange
será por lo tanto 0 con una probabilidad de 1.0/(num + 2)
- y esa es la probabilidad con la que debemos reemplazar la línea seleccionada actualmente (el caso especial del tamaño de muestra 1 del algoritmo referenciado - ver El libro de Knuth como prueba de corrección == y, por supuesto, también estamos en el caso de un "depósito" lo suficientemente pequeño como para caber en la memoria; -) ... y exactamente la probabilidad con que nosotros do so.
+1 para traducir de MIX a python – aaronasterling
Este es un muestreo de yacimientos, ¿no? – HenryR
Siempre he pensado que la función 'random.choice()' debería funcionar tanto en iteradores arbitrarios como en secuencias, implementando exactamente el algoritmo anterior. –
Busque una posición aleatoria, lea una línea y deséchela, luego lea otra línea. La distribución de líneas no será normal, pero eso no siempre importa.
En particular, esto hace que sea imposible seleccionar la primera línea (así como elegir otras líneas con una probabilidad proporcional a la longitud de cada línea anterior). Mi A tampoco produce una distribución normal (eso sería raro, ¿qué significa, qué varianza?), Pero una uniforme, que parece algo más probable de cumplir con el significado del OP para "aleatorio". –
Para solucionar el problema señalado por @AlexMartelli, elija la primera línea en caso de que la búsqueda aleatoria lo lleve a la última línea. Pero otro problema aquí es que una línea que tenga relativamente más palabras para otras líneas tendrá una mayor probabilidad de ser seleccionada. –
Depende de qué significa "demasiada" sobrecarga. Si es posible almacenar todo el archivo en la memoria, entonces algo como
import random
random_lines = random.choice(open("file").readlines())
haría el truco.
import random
lines = open('file.txt').read().splitlines()
myline =random.choice(lines)
print(myline)
Para archivo muy largo: buscan lugar al azar en el archivo basado en su longitud y se encuentran dos caracteres de nueva línea después de la posición (o salto de línea y al final del archivo). Haga de nuevo 100 caracteres antes o desde el principio del archivo si la posición de búsqueda original fuera < 100 si terminamos dentro de la última línea.
Sin embargo, esto es más complicado, ya que el archivo es iterator.So que sea lista y tomar random.choice (si necesita muchos, random.sample uso):
import random
print(random.choice(list(open('file.txt'))))
Si la tarea es leer solo una línea, no tiene sentido cargar el archivo completo en la memoria. – iankit
Aunque soy cuatro años de retraso, Creo que tengo la solución más rápida. Recientemente escribí un paquete de Python llamado linereader, que le permite manipular los punteros de los manejadores de archivos.
Aquí es la solución simple para conseguir una línea al azar con este paquete:
from random import randint
from linereader import dopen
length = #lines in file
filename = #directory of file
file = dopen(filename)
random_line = file.getline(randint(1, length))
La primera vez que se hace esto es lo peor, como linereader tiene que compilar el archivo de salida en un formato especial. Una vez hecho esto, el lector de línea puede acceder rápidamente a cualquier línea del archivo, independientemente del tamaño del archivo.
Si su archivo es muy pequeño (lo suficientemente pequeño como para caber en un MB), puede reemplazar dopen
con copen
, y hace una entrada en caché del archivo dentro de la memoria. No solo es más rápido, sino que obtienes la cantidad de líneas dentro del archivo a medida que se carga en la memoria; está hecho para ti. Todo lo que necesitas hacer es generar el número de línea al azar. Aquí hay un código de ejemplo para esto.
from random import randint
from linereader import copen
file = copen(filename)
lines = file.count('\n')
random_line = file.getline(randint(1, lines))
¡Me puse muy feliz porque vi a alguien que podría beneficiarse de mi paquete! Perdón por la respuesta definitiva, pero el paquete definitivamente podría aplicarse a muchos otros problemas.
Tuve la línea ValueError no. no encontrado, pero la línea no. era menor que el tamaño del archivo. – kakarukeys
Si no desea leer todo el archivo, puede buscar en el medio del archivo, luego buscar hacia atrás la nueva línea y llamar al readline
.
Aquí es un script python3 la que hace precisamente esto,
Una desventaja de este método es líneas cortas tienen una menor likelyhood de aparecer.
def read_random_line(f, chunk_size=16):
import os
import random
with open(f, 'rb') as f_handle:
f_handle.seek(0, os.SEEK_END)
size = f_handle.tell()
i = random.randint(0, size)
while True:
i -= chunk_size
if i < 0:
chunk_size += i
i = 0
f_handle.seek(i, os.SEEK_SET)
chunk = f_handle.read(chunk_size)
i_newline = chunk.rfind(b'\n')
if i_newline != -1:
i += i_newline + 1
break
if i == 0:
break
f_handle.seek(i, os.SEEK_SET)
return f_handle.readline()
Puede agregar las líneas en un conjunto() que va a cambiar su orden al azar.
filename=open("lines.txt",'r')
f=set(filename.readlines())
filename.close()
Para encontrar la primera línea:
print(next(iter(f)))
Para encontrar la 3ª línea:
print(list(f)[2])
para enumerar todas las líneas en el conjunto:
for line in f:
print(line)
Este puede ser voluminoso, pero funciona, supongo? (al menos para archivos txt)
import random
choicefile=open("yourfile.txt","r")
linelist=[]
for line in choicefile:
linelist.append(line)
choice=random.choice(linelist)
print(choice)
Lee cada línea de un archivo y lo agrega a una lista. Luego elige una línea aleatoria de la lista. Si desea eliminar la línea una vez que se ha elegido, simplemente
linelist.remove(choice)
la esperanza que esto puede ayudar, pero al menos no hay módulos adicionales y las importaciones (aparte de azar) y relativamente ligero.
- 1. ¿Cómo leo un archivo gzip línea por línea?
- 2. ¿Lees una línea aleatoria de un archivo? C#
- 3. ¿Cómo leo un archivo de imagen usando Python?
- 4. ¿Cómo leo línea por línea un archivo de texto en ruby (alojado en s3)?
- 5. ¿Cómo leo un archivo en App Engine?
- 6. ¿Cómo obtener una línea aleatoria de un archivo de texto en Java?
- 7. Java - línea de lectura aleatoria
- 8. ¿Cómo leo y edito un archivo .txt en C#?
- 9. iteración aleatoria en Python
- 10. ¿Cómo puedo devolver una línea aleatoria desde un archivo? Pregunta de entrevista
- 11. ¿Cómo leo una línea arbitrariamente larga en C?
- 12. En Python, ¿cómo leo los datos exif de una imagen?
- 13. ¿Cómo leo una línea FIFO/nombrada línea por línea desde una aplicación C++/Qt Linux?
- 14. ¿Cómo leo contenido de ARCHIVO en QML?
- 15. ¿Cómo leo líneas en un archivo de texto en OCaml?
- 16. Escogiendo una palabra aleatoria en Python?
- 17. Reproducción aleatoria en Python
- 18. secuencia aleatoria en python
- 19. ¿Cómo leo la primera línea de una cadena?
- 20. ¿Cómo leo una fecha en formato Excel en Python?
- 21. ¿Cómo leo de un archivo en el mismo directorio?
- 22. ¿Cómo leo un archivo que se actualiza constantemente?
- 23. Generar una letra aleatoria en Python
- 24. Cómo leo un archivo de texto en R cuando los datos no están en una tabla
- 25. Anteponer una línea a un archivo existente en Python
- 26. ¿Cómo hacer una mezcla aleatoria pero parcial en Python?
- 27. cómo dar salida a cada línea en un archivo python
- 28. ¿Cómo leo archivos seleccionados de un archivo Zip remoto a través de HTTP usando Python?
- 29. VB - ¿Cómo leo y escribo un archivo binario?
- 30. Quiero leer en un archivo desde la línea de comando en python
@Greg That's Perl, no Python – quantumSoup
@quantumSoup: La pregunta usa Perl en sus ejemplos, pero la pregunta es independiente del idioma. Las respuestas más útiles usan pseudocódigo, fácilmente traducido a su idioma de elección. –
Gracias, también encontré esta ayuda mucho: http://mail.python.org/pipermail/tutor/2007-July/055635.html Aunque tienes que leerlos en la memoria. – Shane