python_random随机

在数据清洗,评估 ,抽验等等过程中,经常有这样的应用场景 :

  需要在一个大的数据集合中随机出来样本,进行人工评估。为了保证足够随机,借助脚本来实现。

下面一个脚本  ,用于应对这种应用场景。

使用方法: python random_select_line.py -h

建议:自定义 alias random  。 使用起来就高效很多 
import os, sys, argparse, random;
import subprocess;

parser = argparse.ArgumentParser()

parser.add_argument('-i', '--input', help = 'input file')
parser.add_argument('-o', '--output', help = 'output file')
parser.add_argument('--stdout', help = 'output to stdout, arg(--output) would be ignore', action = "store_true")
parser.add_argument('-n', '--number', type = int, help = 'number of selected line')

args, leftargs = parser.parse_known_args(sys.argv)


if (not args.input) or (not args.output) or (not args.number):
    sys.stderr.write('wrong argument\n')
    #sys.stderr.write(parser)
    exit(1)

num = -1
try:
    rtn_str = subprocess.check_output(['wc', '-l', args.input])
    num = (int)(rtn_str.split()[0])
except:
    sys.stderr.write('get input_file[%s] line number failed\n' % args.input)
    exit(1)

sys.stderr.write('total line number = %d\n' % num)
start = min(num, args.number)
reserve_line = range(0, start)


for i in xrange(start, num):
    m = random.randint(0, i)
    if m < start:
        reserve_line[m] = i


reserve_set = set(reserve_line)

ifst = open(args.input, 'r')
if args.stdout:
    ofst = sys.stdout
else:
    ofst = open(args.output, 'w')

i = -1;
for line in ifst:
    i += 1
    if i in reserve_set:
        ofst.write(line)

ifst.close()
ofst.close()

sys.stderr.write('bye\n')

 

posted @ 2015-08-08 13:31  cphmvp  阅读(351)  评论(0编辑  收藏  举报
爬虫在线测试小工具: http://tool.haoshuju.cn/