目前,我通过一堆记忆不佳的AWK、sed、Bash和少量Perl来处理文本文件.

我看到有几个地方提到,Python对这类事情很有好处.如何使用Python取代shell脚本、awk、sed和Friends?

推荐答案

任何shell都有多组功能.

  • 基本的Linux/Unix命令.所有这些都可以通过subprocess图书馆获得.这并不总是执行all个外部命令的最佳首选.另请看shutil中的一些命令,它们是独立的Linux命令,但您可能可以直接在Python脚本中实现.os库中还有大量Linux命令;您可以在Python中更简单地执行这些操作.

    还有—— prize !——更快.shell中每个单独的Linux命令(除了少数例外)都会派生一个子进程.通过使用Pythonshutilos模块,您不需要派生子流程.

  • shell 环境具有特征.这包括设置命令环境的内容(当前目录和环境变量等等).您可以直接从Python轻松地进行管理.

  • shell编程功能.这是所有进程状态码判断、各种逻辑命令(IF、WHILE、FOR等)测试指挥部及其所有相关人员.函数定义之类的东西.在Python中,这一切都要容易得多.这是摆脱bash并用Python实现的巨大胜利之一.

  • 互动功能.这包括命令历史记录等等.编写shell脚本时不需要这个.这只是为了与人交流,而不是为了写 playbook .

  • shell文件管理功能.这包括重定向和管道.这更棘手.这大部分可以通过子流程完成.但是,在Python中,有些在shell中很容易实现的事情是令人不快的.特别是像(a | b; c ) | something >result.这将并行运行两个进程(a的输出作为b的输入),然后是第三个进程.该序列的输出与something并行运行,并将输出收集到名为result的文件中.这很难用其他语言表达.

特定程序(awk、sed、grep等)通常可以重写为Python模块.别太过火了.替换您需要的内容,并发展您的"grep"模块.不要一开始就编写取代"grep"的Python模块.

最好的办法是你可以分步完成.

  1. 用Python替换AWK和PERL.别管其他事.
  2. 看看用Python替换GREP.这可能有点复杂,但您的GREP版本可以根据您的处理需求进行定制.
  3. 看看用使用os.walk的Python循环替换FIND.这是一个巨大的胜利,因为您不会产生那么多进程.
  4. 看看用Python脚本替换常见的shell逻辑(循环、决策等).

Python相关问答推荐

配置Sweetviz以分析对象类型列,而无需转换

如何从具有多个嵌入选项卡的网页中Web抓取td类元素

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

DataFrame groupby函数从列返回数组而不是值

根据不同列的值在收件箱中移动数据

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

如何访问所有文件,例如环境变量

如何列举Pandigital Prime Set

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

Pandas DataFrame中行之间的差异

使用密钥字典重新配置嵌套字典密钥名

Pandas—在数据透视表中占总数的百分比

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

Python—转换日期:价目表到新行

Python避免mypy在相互引用中从另一个类重定义类时失败

计算空值

如何在Python中解析特定的文本,这些文本包含了同一行中的所有内容,

对于数组中的所有元素,Pandas SELECT行都具有值

在MongoDB文档中仅返回数组字段