将awk脚本移植到Python的方法

  介绍

这篇文章给大家分享的是有关将awk脚本移植到Python的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

将一个awk脚本移植到Python主要在于代码风格而不是转译。

脚本是解决问题的有效方法,而awk是编写脚本的出色语言。它特别擅长于简单的文本处理,它可以带你完成配置文件的某些复杂重写或目录中文件名的重新格式化。

<强>何时从awk转向Python

但是在某些方面,awk的限制开始显现出来。它没有将文件分解为模块的真正概念,它缺乏质量错误报告,并且缺少了现在被认为是编程语言工作原理的其他内容。当编程语言的这些丰富功能有助于维护关键脚本时,移植将是一个不错的选择。

我最喜欢的完美移植awk的现代编程语言是Python。

在将awk脚本移植到Python之前,通常值得考虑一下其原始使用场景,例如,由于awk的局限性,通常从Bash脚本调用awk代码,其中包括一些对sed,排序之类的其它命令行常见工具的调用。最好将所有内容转换为一个一致的Python程序。有时,脚本会做出过于宽泛的假设,例如,即使实际上只运行一个文件,该代码也可能允许任意数量的文件。

在仔细考虑了上下文并确定了要用Python替代的东西之后,该编写代码了。

<强>标准awk到Python功能

以下Python功能是有用的,需要记住:

with 开放(some_file_name), as  fpin:   for 才能;line  fpin:拷贝   ,,,pass  #, do  something  with 行

此代码将逐行循环遍历文件并处理这些行。

如果要访问行号(相当于awk的NR),则可以使用以下代码:

with 开放(some_file_name), as  fpin:   for 才能;nr, line 拷贝列举(fpin):   ,,,pass  #, do  something  with 行

<强>在Python中实现多文件的awk式行为

如果你需要能够遍历任意数量的文件同时保持行数的持续计数(类似awk的FNR),则此循环可以做到这一点:

def  awk_like_lines (list_of_file_names):   def 才能_all_lines ():   ,,,for  filename 拷贝list_of_file_names:   ,,,,,with 开放(文件名),as  fpin:   ,,,,,,,油品收率得到fpin   油品收率才能得到列举(_all_lines ())

此语法使用Python的生成器和收益率从来构建迭代器,该迭代器将遍历所有行并保持一个持久计数。

如果你需要同时使用FNR和NR,这是一个更复杂的循环:

def  awk_like_lines (list_of_file_names):   def 才能_all_lines ():   ,,,for  filename 拷贝list_of_file_names:   ,,,,,with 开放(文件名),as  fpin:   ,,,,,,,油品收率得到列举(fpin)   for 才能;nr, (fnr,线),拷贝_all_lines:   ,,,油品收率nr,, fnr,,行

更复杂的fnr, nr和行数的awk行为

如果fnr, nr和行数这三个你全都需要,仍然会有一些问题。如果确实如此,则使用三元组(其中两个项目是数字)会导致混淆。命名参数可使该代码更易于阅读,因此最好使用dataclass:

import  dataclass   @dataclass.dataclass(冻结=True)   class  AwkLikeLine:   内容:才能str   fnr才能:int   nr才能:int   def  awk_like_lines (list_of_file_names):   def 才能_all_lines ():   ,,,for  filename 拷贝list_of_file_names:   ,,,,,with 开放(文件名),as  fpin:   ,,,,,,,油品收率得到列举(fpin)   for 才能;nr, (fnr,线),拷贝_all_lines:   ,,,油品收率AwkLikeLine (nr=nr, fnr=fnr,,=线)

你可能想知道,为什么不一直用这种方法呢?使用其它方式的的原因是总用这种方法太复杂了。如果你的目标是把一个通用库更容易地从awk移植到Python,请考虑这样做。但是编写一个可以使你确切地了解特定情况所需的循环的方法通常更容易实现,也更容易理解(因而易于维护)。

<强>理解awk字段

一旦有了与一行相对应的字符串,如果要转换awk程序,则通常需要将其分解为字段.Python有几种方法可以做到这一点。这将把行按任意数量的连续空格拆分,返回一个字符串列表:

<代码> line.split()

如果需要另一个字段分隔符,比如以:分隔行,则需要rstrip方法来删除最后一个换行符:

<代码> line.rstrip (“\ n") .split(“:”)

完成以下操作后,列表部分将存有分解的字符串:

将awk脚本移植到Python的方法