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