3

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

4

6 回答 6

7

如果您知道文件有多少行,则可以使用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或者end=''print. 例如linecache,第一个显然不起作用,但您仍然可以执行其他任何一个。


另请注意,我使用了 stdlibrandom库而不是在numpy此处使用。如果您只是生成 10 个随机数以用于普通 Python 代码,则没有理由使用numpy. (另一方面,如果您确实有充分的理由在numpy此处使用,您可能希望将这些行读入pandas表格并将随机索引应用于该表格。)

于 2013-08-27T01:58:17.913 回答
6

如果您知道您的文件正好是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)
于 2013-08-27T01:38:46.220 回答
2

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

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

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

于 2013-08-27T01:58:02.233 回答
1

可以一次性完成这项工作,而无需将整个文件加载到内存中。尽管代码本身会变得更加复杂,而且大部分都不需要,除非文件很大。

诀窍如下:

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

于 2013-08-27T03:49:59.870 回答
0

尝试行缓存:

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)
于 2013-08-27T01:45:18.007 回答
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

我希望它对你有帮助!干杯!

于 2013-08-27T02:06:45.823 回答