如何修改Python实现的shuf命令以支持无参读取标准输入?
修复后的代码
#!/usr/local/cs/bin/python3 import argparse import random import sys def shuf_lines(lines, repeat, head_count, zero_terminated): delimiter = '\0' if zero_terminated else '\n' if not lines: return if repeat and not head_count: while True: print(random.choice(lines), end=delimiter) else: if repeat: selected = [random.choice(lines) for _ in range(head_count)] if head_count else [random.choice(lines)] * len(lines) else: random.shuffle(lines) selected = lines[:head_count] if head_count else lines for line in selected: print(line, end=delimiter) def main(): parser = argparse.ArgumentParser( prog='shuf', description='Write a random permutation of the input lines to standard output.', add_help=False ) parser.add_argument('-e', '--echo', action='store_true', help='treat each ARG as an input line') parser.add_argument('-i', '--input-range', metavar='LO-HI', help='treat each number LO through HI as an input line') parser.add_argument('-n', '--head-count', type=int, help='output at most COUNT lines') parser.add_argument('-r', '--repeat', action='store_true', help='output lines can be repeated') parser.add_argument('-z', '--zero-terminated', action='store_true', help='line delimiter is NUL, not newline') parser.add_argument('--help', action='help', help='display this help and exit') parser.add_argument('files', metavar='SOURCE', nargs = '*', help='input file name or - for standard input') args = parser.parse_args() input_lines = [] delimiter = '\0' if args.zero_terminated else '\n' if args.echo: input_lines = args.files elif args.input_range: try: start, end = map(int, args.input_range.split('-')) input_lines = list(map(str, range(start, end + 1))) except ValueError: sys.exit("shuf: invalid input range") elif args.files: for file in args.files: try: if file == '-': content = sys.stdin.read() input_lines.extend(content.split(delimiter)[:-1] if content else []) else: with open(file, 'r') as f: content = f.read() input_lines.extend(content.split(delimiter)[:-1] if content else []) except FileNotFoundError: sys.exit(f"shuf: {file}: No such file or directory") else: content = sys.stdin.read() input_lines.extend(content.split(delimiter)[:-1] if content else []) shuf_lines(input_lines, args.repeat, args.head_count, args.zero_terminated) if __name__ == '__main__': main()
关键修改说明
- 修正无参逻辑:移除原代码末尾的报错分支,将无参数时的标准输入读取逻辑作为默认分支,直接处理输入内容。
- 修复行分割问题:替换原代码中的
split()为按指定分隔符(换行或NUL)分割,split(delimiter)[:-1]用于剔除输入结束时分隔符产生的空元素,保证行数据准确。 - 优化repeat模式:补充repeat模式下
head_count参数的处理逻辑,实现指定数量的重复随机输出。 - 统一分隔符处理:提前根据
zero_terminated参数确定分隔符,确保所有输入读取逻辑的一致性。 - 空输入保护:在
shuf_lines函数开头添加空输入判断,避免无输入时触发后续操作报错。
内容的提问来源于stack exchange,提问作者Albert Mkhitaryan
相关产品推荐
相关产品推荐

