从文件中检索10个随机行

时间:2013-08-27 01:35:35

标签: python numpy

我有一个10k行长的文本文件,我需要构建一个函数,每次从这个文件中提取10个随机行。我已经找到了如何使用numpy在Python中生成随机数,以及如何打开文件,但我不知道如何将它们混合在一起。请帮忙。

6 个答案:

答案 0 :(得分:6)

如果您知道该文件有多长行,则可以使用linecache,如其他答案所示。但只要知道它的大小是10K,就不会告诉你它有多长行。

如果您知道该文件足够小以适应内存 - 并且10K文件足够小 - 只需将其读入内存:

import random

with open('file.txt') as f:
    lines = list(f)
for i in range(10):
    print(random.choice(lines))

但是,如果您不知道文件有多长,并且无法将其全部读入内存,该怎么办?然后你需要做两遍:

import linecache
import random

with open('file.txt') as f:
    linecount = sum(1 for line in f)
for i in range(10):
    print(linecache.getline('file.txt', random.range(linecount)))

请注意,两者都会在每行末尾留下换行符。如果您想摆脱这些,可以将第一个示例从list(f)更改为[line.rstrip() for line in f],或者只需在rstrip()中调用print,或使用{{1} end=''中的(Python 3.x)或尾随逗号(Python 2.x)。对于print示例,第一个显然不起作用,但您仍然可以执行其他任一个。


另请注意,我在此使用了stdlib linecache库而不是random。如果您只是生成10个随机数用于普通Python代码,则没有理由使用numpy。 (另一方面,如果你有充分的理由在这里使用numpy,你可能想要将这些行读入numpy表并将随机索引应用于这一点。)

答案 1 :(得分:5)

如果你知道你的文件完全 10k 长,那么你可以使用linecache

import random
import linecache

def random_lines(filename)
    idxs = random.sample(range(10000), 10)
    return [linecache.getline(filename, i) for i in idxs]

这将返回一个包含10个随机行的列表,您可以使用这些行进行打印:

for line in random_lines('file.txt'):
    print line

答案 2 :(得分:2)

您可以使用不关心文件长度的代码,但在极少数情况下,您可能会出现重复:

from random import choice
lines = [a.strip() for a in open("yourfile").readlines()]
result = [choice(lines) for a in range(10)]

result是一个列表,其中包含从名为yourfile的文件中随机选择的10行。

答案 3 :(得分:1)

可以通过一次传递完成工作,也可以不将整个文件加载到内存中。虽然代码本身会变得更复杂,并且除非文件是巨大的,否则大多数都不需要。

诀窍如下:

假设我们只需要一个随机行,然后首先将第一行保存到变量中,然后对于第i行,用当前概率1 / i替换当前行。到达文件末尾时返回保存的行。 对于10个随机行,然后有一个10个元素的列表,并为该文件中的每一行执行10次该过程。

答案 4 :(得分:0)

尝试使用linecache:

import linecache
#put your 3 randoms into an array in whichever way you are doing it
lines = [3,45,678]  #use your existing code here
for i in lines:
    linecache.getline('/etc/file', i)

答案 5 :(得分:0)

如果您不知道文件的行数,可以使用以下代码计算它们:

line_count = 0
with open(filename) as file:
    for line in file:
        line_count += 1

然后,您将能够生成[0, line_count)范围内的随机数:

import random
lines_to_read = []
for i in range(10):
    line = random.randint(0, line_count - 1)
    lines_to_read.append(line)

最后,再次读取文件,选择随机选择的那些行,然后用它们做任何你想做的事情,例如,打印它们:

with open(filename) as file:
    for index, line in enumerate(file):
        if index in lines_to_read:
            print line

我希望它可以帮到你!干杯!