我有一个10k行长的文本文件,我需要构建一个函数,每次从这个文件中提取10个随机行。我已经找到了如何使用numpy在Python中生成随机数,以及如何打开文件,但我不知道如何将它们混合在一起。请帮忙。
答案 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
我希望它可以帮到你!干杯!