You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:07:35