2010-11-05 8 views

Respuesta

16

Su requisito es un poco vago, así que aquí tiene otro método ligeramente diferente (en busca de inspiración si no otra cosa):

from random import random 
lines = [line for line in open("/some/file") if random() >= .5] 

En comparación con las otras soluciones, el número de las líneas varía menos (distribución alrededor de la mitad del número total de líneas), pero cada línea se elige con un 50% de probabilidad, y solo se requiere una pasada a través del archivo.

+0

+1 Me gusta mucho esta solución. – aaronasterling

+0

¿Cuál es el significado de 'random.random()> .5' aquí? – user225312

+0

'random()' devuelve un número aleatorio entre 0 y 1 con una distribución uniforme. 'random()> .5' será verdadero la mitad del tiempo ± una distribución normal, es decir, cada línea se selecciona con un 50% de probabilidad. – SimonJ

0
import os,random 

def getrandfromMem(filename) : 
    fd = file(filename,'rb') 
    l = fd.readlines() 
    pos = random.randint(0,len(l)) 
    fd.close() 
    return (pos,l[pos]) 

def getrandomline2(filename) : 
    filesize = os.stat(filename)[6] 
    if filesize < 4096 : # Seek may not be very useful 
    return getrandfromMem(filename) 

    fd = file(filename,'rb') 
    for _ in range(10) : # Try 10 times 
    pos = random.randint(0,filesize) 
    fd.seek(pos) 
    fd.readline() # Read and ignore 
    line = fd.readline() 
    if line != '' : 
     break 

    if line != '' : 
    return (pos,line) 
    else : 
    getrandfromMem(filename) 

getrandomline2("shaks12.txt") 
+0

también puede marcar http://www.bryceboe.com/2009/03/23/random-lines-from-a-file/ –

0

Suponiendo que el desplazamiento es siempre al principio del archivo:

import random 
lines = file('/your/file').read().splitlines() 
n_lines = random.randrange(len(lines)) 
random_lines = lines[:n_lines] 

Tenga en cuenta que esto va a leer todo el archivo en la memoria.

+0

esto solo devolverá las primeras n líneas. – aaronasterling

2
import linecache 
import random 
import sys 


# number of line to get. 
NUM_LINES_GET = 5 

# Get number of line in the file. 
with open('file_name') as f: 
    number_of_lines = len(f.readlines()) 

if NUM_LINES_GET > number_of_lines: 
    print "are you crazy !!!!" 
    sys.exit(1) 

# Choose a random number of a line from the file. 
for i in random.sample(range(1, number_of_lines+1), NUM_LINES_GET) 
    print linecache.getline('file_name', i) 

linecache.clearcache() 
+0

Eso no es un número aleatorio de líneas. – aaronasterling

+0

@aaronasterling: ¿ehh? Tal vez no entendí bien la pregunta, pero pidió un número aleatorio de líneas, no los números de una línea al azar, ¿verdad? – mouad

+0

siempre devuelve 5 líneas, y 5 no es muy aleatorio :) Pero estoy de acuerdo, la pregunta era vaga. – SimonJ

12

para obtener un número de líneas al azar de su archivo se podría hacer algo como lo siguiente:

import random 
with open('file.txt') as f: 
    lines = random.sample(f.readlines(),5) 

El ejemplo anterior devuelve 5 líneas, pero se puede cambiar fácilmente que hasta el número que desee. También puede cambiarlo a randint() para obtener un número aleatorio de líneas además de una cantidad de líneas aleatorias, pero debe asegurarse de que el tamaño de la muestra no sea mayor que el número de líneas del archivo. Dependiendo de su entrada, esto puede ser trivial o un poco más complejo.

Tenga en cuenta que las líneas podrían aparecer en lines en un orden diferente al que aparecen en el archivo.

Cuestiones relacionadas