在数据清洗,评估 ,抽验等等过程中,经常有这样的应用场景 :
需要在一个大的数据集合中随机出来样本,进行人工评估。为了保证足够随机,借助脚本来实现。
下面一个脚本 ,用于应对这种应用场景。
使用方法: 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 ') #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 ' % args.input) exit(1) sys.stderr.write('total line number = %d ' % 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 ')