我有一个 10k 行长的文本文件,我需要构建一个函数来每次从该文件中提取 10 行随机行。我已经找到了如何使用 numpy 在 Python 中生成随机数以及如何打开文件,但我不知道如何将它们混合在一起。请帮忙。
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
或者end=''
在print
. 例如linecache
,第一个显然不起作用,但您仍然可以执行其他任何一个。
另请注意,我使用了 stdlibrandom
库而不是在numpy
此处使用。如果您只是生成 10 个随机数以用于普通 Python 代码,则没有理由使用numpy
. (另一方面,如果您确实有充分的理由在numpy
此处使用,您可能希望将这些行读入pandas
表格并将随机索引应用于该表格。)
如果您知道您的文件正好是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)
您可以使用不关心文件长度的代码,但是在极少数情况下您可能会得到重复:
from random import choice
lines = [a.strip() for a in open("yourfile").readlines()]
result = [choice(lines) for a in range(10)]
result
是一个列表,其中包含从名为 的文件中随机选择的 10 行yourfile
。
可以一次性完成这项工作,而无需将整个文件加载到内存中。尽管代码本身会变得更加复杂,而且大部分都不需要,除非文件很大。
诀窍如下:
假设我们只需要一个随机行,那么首先将第一行保存到一个变量中,然后对于第 i 行,用概率 1/i 替换当前行。到达文件末尾时返回保存的行。对于 10 个随机行,然后有一个包含 10 个元素的列表,并对文件中的每一行执行 10 次该过程。
尝试行缓存:
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)
如果您不知道文件的行数,可以使用例如以下代码来计算它们:
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
我希望它对你有帮助!干杯!