gpt4 book ai didi

python - Python 递归控制台工具的最佳实践

转载 作者:太空狗 更新时间:2023-10-30 03:07:42 25 4
gpt4 key购买 nike

命令行工具的最佳实践(接口(interface)和实现)是什么处理目录树中的选定文件?

我举了一个我想到的例子,但我正在寻找“最佳实践”:

flipcase foo.txt foo2.txt

可以处理 foo.txt 并将结果保存为 foo2.txt。

flipcase -rv *.txt

可以处理当前目录下的所有文本文件。
-r--recursive 将包含所有子目录。
-v 将在处理时将一些信息打印到标准输出。

我在这个例子中看到的一个问题是,*.txt 参数是有时会被 shell(Unix 和 Vista)扩展,所以我不能应用这种模式在遍历子目录时。
我想原因是,在 Unix 上,此类工具会调用 find,但这在 Windows 上似乎并不常见。这也使得打印一个总结在最后。

要求:

  • 必须在 Unix、Windows XP、Windows 7 和 Mac 上运行
  • 应遵循这些平台上的通用惯例。(是的,我知道。但我正在寻找一个合理的妥协。例如,在 Windows 上可以使用 - 而不是 /。)
  • 不应像 grep 那样依赖单独的查找命令。
  • 必须适用于单个文件、文件模式和目录中的模式层次结构。
  • 应该使用标准 Python 库构建,例如OptionParseros.walk
  • 可以处理多种模式,例如*.txt,*.html.

关于设计决策的其他问题:

  • 此工具应返回什么(状态代码)?
  • 此工具应处理哪些 ctrl 键,以何种方式处理?
  • 是否应该支持 stdin 而不是单个文件?可配置或自动检测?
  • 是否应该支持输出重定向?可配置还是自动检测?在这种情况下如何处理调试输出?
  • 模式应该是 glob 语法还是正则表达式?
  • 是否有支持递归的通用模式语法?也许 recursive:*.txt在这种情况下,-r 选项将不是必需的。
  • 为修改后的文件创建备份的最佳做法是什么?选项 -b,或者默认情况下有备份并添加 --no-backup 选项
  • 对于单个文件,应该可以指定一个目标文件名。怎么样?
  • 应该打印什么状态信息,热配置这个?默认情况下它应该是冗长的并且我们允许 -q 安静吗?或者总是打印一点点并允许 -v(或 -vv)提升这个或 -q 到完全闭嘴?

我真的不希望得到一个正确的答案,但可能有几个好的示例项目的想法和指示。

最佳答案

根据我的经验,最好的起点是构建一个遵循基本 Unix 原则的工具——即从标准输入读取并写入标准输出。这允许人们以灵活的方式使用您的工具:

flipcase input.txt > output.txt
othercommand | flipcase > output.txt
flipcase | othercommand > ouput.txt
flipcase input1.txt input2.txt > output.txt

下一个功能可能是就地编辑:

# Modify input files directly.
flipcase -i input.txt

# Create backup copies before modifying originals.
flipcase -i --backup-suffix '_BAK' input.txt
flipcase -i --backup-prefix 'BAK_' input.txt

# Regex for power users.
flipcase -i --backup-regex 's/foo/bar/' input.txt

在详细模式下,该工具不应写入标准输出,因为这会与上述核心原则相冲突。它应该写入标准错误或用户定义的日志文件。

flipcase -v         input.txt > output.txt
flipcase -v log.txt input.txt > output.txt

之后,您添加递归行为。这里的方向不太明确,但我会抛出一些想法。在典型的递归情况下,程序的参数可能是目录,用户需要提供额外的选项来定义各种类型的过滤行为(即要处理的文件类型)。

flipcase -r -i --backup-suffix '_BAK' --filter-glob '*.txt' dir1 dir2
flipcase -r -i --backup-suffix '_BAK' --filter-glob '*.txt' --filter-glob 'log*.dat' dir
flipcase -r -i --backup-suffix '_BAK' --filter-regex 'log\w+\.(txt|log)$' dir1 dir2

# Don't do in-place editing. Instead create new files within the structure.
flipcase -r --newname-suffix '_NEW' --filter-glob '*.txt' dir1 dir2
flipcase -r --newname-regex 's/\.txt$/_new.txt/' --filter-glob '*.txt' dir1 dir2

# Create the backups or the new files in a parallel directory
# structure rather than within the original structure.
flipcase -r -i --backup-tree 'backup_dir' --filter-glob '*.txt' dir1 dir2
flipcase -r -i --new-tree 'newfiles_dir' --filter-glob '*.txt' dir1 dir2

关于python - Python 递归控制台工具的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3646620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com