处理文件

Click内置功能来支持文件和文件路径处理。示例使用参数,但相同的原则也适用于选项。

文件参数

单击支持使用 File 类型.一些值得注意的功能是:

  • 支持 - 指的是一个特殊文件,用于读取时引用stdin,用于写入时引用stdout。这是MISIX命令行实用程序的常见模式。

  • 处理 strbytes 对于所有版本的Python都正确。

示例:

@click.command()
@click.argument('input', type=click.File('rb'))
@click.argument('output', type=click.File('wb'))
def inout(input, output):
    """Copy contents of INPUT to OUTPUT."""
    while True:
        chunk = input.read(1024)
        if not chunk:
            break
        output.write(chunk)

从命令行:

$ inout - hello.txt
hello
^D
$ inout hello.txt -
hello

文件路径参数

对于处理路径, Path 类型优于A str .一些值得注意的功能是:

  • exists 参数将验证路径是否存在。

  • readable , writable ,而且 executable 可以执行权限检查。

  • file_okaydir_okay 允许指定是否接受文件/目录。

  • 错误消息的格式很好地使用 format_filename() 因此任何不可解码的字节都将被很好地打印。

看到 Path 适用于所有功能。

示例:

@click.command()
@click.argument('filename', type=click.Path(exists=True))
def touch(filename):
    """Print FILENAME if the file exists."""
    click.echo(click.format_filename(filename))

从命令行:

$ touch hello.txt
hello.txt

$ touch missing.txt
Usage: touch [OPTIONS] FILENAME
Try 'touch --help' for help.

Error: Invalid value for 'FILENAME': Path 'missing.txt' does not exist.

文件打开行为

File 类型试图“智能”地了解何时打开文件。Stdin/stdout和打开以读取的文件将立即打开。当无法打开文件时,这将向用户提供直接反馈。打开以写入的文件仅在第一次IO操作时打开。这是通过自动将文件包装在特殊的包装器中来完成的。

文件打开行为可以由布尔kwag控制 lazy .如果文件被懒惰打开:

  • 第一次IO操作时将发生失败,因为提出 FileError .

  • 它可以帮助最大限度地减少资源处理混乱。 如果在懒惰模式下打开文件,它将调用 LazyFile.close_intelligently() 来判断文件是否需要关闭这对于参数来说不是必需的,但是对于手动提示来说是必需的。对于手动提示, prompt() 您不知道是否打开了stdout这样的流(之前已经打开过)或打开了真正的文件(需要关闭)。

由于打开文件进行写入通常会清空文件,因此只有在开发人员完全确定这是预期行为时才应禁用懒惰模式。

还可以通过以下方式以原子模式打开文件 atomic=True . 在原子模式下,所有写入都会进入同一文件夹中的单独文件,完成后,文件将被移动到原始位置。 如果其他用户定期读取的文件被修改,这很有用。