从命令行中选择一个非常大的文件中的随机行

时间:2014-07-23 02:47:05

标签: python linux file random io

假设你有一个非常大的文件,通过所有线路或者减速会很昂贵。

你如何随机选择一行(最好是从命令行或python)?

3 个答案:

答案 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)