假设你有一个非常大的文件,通过所有线路或者减速会很昂贵。
你如何随机选择一行(最好是从命令行或python)?
答案 0 :(得分:1)
你可以从命令行尝试这个 - 不确定是否完全随机,但至少是一个开始。
$ lines=$(wc -l file | awk '{ print $1 }'); sed -n "$((RANDOM%lines+1))p" file
这样的工作原理如下:
首先,它设置一个包含文件中行数的变量。
lines=$(wc -l file | awk '{ print $1 }')
稍后,它会在该范围内打印一条随机行:
sed -n "$((RANDOM%lines+1))p" file
正如Mark Ransom所指出的,上述解决方案会读取整个文件。我找到了一种方法来选择一个随机行,而不必(必须)读取整个文件,但只是其中的一部分。使用(我认为)相同的算法,这里是Perl和Python解决方案的链接:
Perl:How do I pick a random line from a file?
perl -e 'srand;' \
-e 'rand($.) < 1 && ($it = $_) while <>;' \
-e 'print $it' FILE
Python:Retrieving a Line at Random from a File of Unknown Size
import random
def randomLine(file_object):
"Retrieve a random line from a file, reading through the file once"
lineNum = 0
selected_line = ''
while 1:
aLine = file_object.readline( )
if not aLine: break
lineNum = lineNum + 1
# How likely is it that this is the last line of the file?
if random.uniform(0,lineNum)<1:
selected_line = aLine
file_object.close( )
return selected_line
答案 1 :(得分:0)
如果你想在python中做到这一点。你来了。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import os
import random
def test():
filename = 'yourfile'
info = os.popen('wc -l filename').readlines()
line_number = info[0].split()[0]
r = random.randrange(line_number)
cmd = 'sed -n "%dp" %s' % (r, filename)
info = os.popen(cmd).readlines()
print info
if __name__ =='__main__':
test()
答案 2 :(得分:0)
可能你可以使用linecache,
import linecache
linecache.getline(file_path, line_no)