我有一个10k行长的文本文件,我需要构建一个函数,每次从这个文件中提取10个随机行.我已经找到了如何使用numpy在Python中生成随机数,以及如何打开文件,但我不知道如何将它们混合在一起.请帮忙.
如果您知道该文件有多长行,您可以使用linecache,如其他答案所示.但只要知道它的大小为10K就不会告诉你它有多长.
如果您知道该文件足够小以适应内存 - 并且10K文件足够小 - 只需将其读入内存:
import random
with open('file.txt') as f:
lines = list(f)
for i in range(10):
print(random.choice(lines))
Run Code Online (Sandbox Code Playgroud)
但是,如果您不知道文件有多长,并且无法将其全部读入内存,该怎么办?然后你需要做两次通过:
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)))
Run Code Online (Sandbox Code Playgroud)
请注意,两者都将在每行末尾留下换行符.如果你想摆脱这些,你可以第一个例子,从改变list(f)到[line.rstrip() for line in f],或者只是打电话rstrip()的print,或者使用end=''在(Python 3.x都有)或后面的逗号(Python的2.X) print.对于linecache例如,第一个显然是行不通的,但你仍然可以做任何其他人.
另请注意,我使用的是stdlib random库,而不是在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]
Run Code Online (Sandbox Code Playgroud)
这将返回一个包含10个随机行的列表,您可以使用以下列打印:
for line in random_lines('file.txt'):
print line
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2091 次 |
| 最近记录: |