处理文件¶
Click内置功能来支持文件和文件路径处理。示例使用参数,但相同的原则也适用于选项。
文件参数¶
单击支持使用 File
类型.一些值得注意的功能是:
支持
-
指的是一个特殊文件,用于读取时引用stdin,用于写入时引用stdout。这是MISIX命令行实用程序的常见模式。处理
str
和bytes
对于所有版本的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_okay
和dir_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
. 在原子模式下,所有写入都会进入同一文件夹中的单独文件,完成后,文件将被移动到原始位置。 如果其他用户定期读取的文件被修改,这很有用。