返回顶部
首页 > 资讯 > 后端开发 > Python >awk脚本怎么移植到Python
  • 437
分享到

awk脚本怎么移植到Python

2023-06-16 17:06:20 437人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

本篇文章为大家展示了awk脚本怎么移植到python,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。何时从 awk 转向 Python但是在某些方面,awk 的限制开始显现出来。它没有将文件分解为模块

本篇文章为大家展示了awk脚本怎么移植到python,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

何时从 awk 转向 Python

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

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

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

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

标准 awk 到 Python 功能

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

with open(some_file_name) as fpin:    for line in fpin:        pass # do something with line

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

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

with open(some_file_name) as fpin:    for nr, line in enumerate(fpin):        pass # do something with line

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

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

def awk_like_lines(list_of_file_names):    def _all_lines():        for filename in list_of_file_names:            with open(filename) as fpin:                yield from fpin    yield from enumerate(_all_lines())

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

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

def awk_like_lines(list_of_file_names):    def _all_lines():        for filename in list_of_file_names:            with open(filename) as fpin:                yield from enumerate(fpin)    for nr, (fnr, line) in _all_lines:        yield nr, fnr, line

更复杂的 FNR、NR 和行数的 awk 行为

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

import dataclass @dataclass.dataclass(frozen=True)class AwkLikeLine:    content: str    fnr: int    nr: int def awk_like_lines(list_of_file_names):    def _all_lines():        for filename in list_of_file_names:            with open(filename) as fpin:                yield from enumerate(fpin)    for nr, (fnr, line) in _all_lines:        yield AwkLikeLine(nr=nr, fnr=fnr, line=line)

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

理解 awk 字段

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

line.split()

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

line.rstrip("\n").split(":")

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

parts = line.rstrip("\n").split(":")

这种拆分非常适合用来处理参数,但是我们处于偏差一个的错误场景中。现在 parts[0] 将对应于 awk 的 $1parts[1] 将对应于 awk 的 $2,依此类推。之所以偏差一个,是因为 awk 计数“字段”从 1 开始,而 Python 从 0 开始计数。在 awk 中,$0 是整个行 —— 等同于 line.rstrip("\n"),而 awk 的 NF(字段数)更容易以 len(parts) 的形式得到。

移植 awk 字段到 Python

例如,让我们将这个单行代码“如何使用 awk 从文件中删除重复行”转换为 Python。

awk 中的原始代码是:

awk '!visited[$0]++' your_file > deduplicated_file

“真实的” Python 转换将是:

import collectionsimport sys visited = collections.defaultdict(int)for line in open("your_file"):    did_visit = visited[line]    visited[line] += 1    if not did_visit:        sys.stdout.write(line)

但是,Python 比 awk 具有更多的数据结构。与其计数访问次数(除了知道是否看到一行,我们不使用它),为什么不记录访问的行呢?

import sys visited = set()for line in open("your_file"):    if line in visited:        continue    visited.add(line)    sys.stdout.write(line)

编写 Python 化的 awk 代码

Python 社区提倡编写 Python 化的代码,这意味着它要遵循公认的代码风格。更加 Python 化的方法将区分唯一性和输入/输出的关注点。此更改将使对代码进行单元测试更加容易:

def unique_generator(things):    visited = set()    for thing in things:        if thing in visited:            continue        visited.add(things)        yield thing import sys   for line in unique_generator(open("your_file")):    sys.stdout.write(line)

将所有逻辑置于输入/输出代码之外,可以更好地分离问题,并提高代码的可用性和可测试性。

上述内容就是awk脚本怎么移植到Python,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网Python频道。

--结束END--

本文标题: awk脚本怎么移植到Python

本文链接: https://lsjlt.com/news/284431.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • awk脚本怎么移植到Python
    本篇文章为大家展示了awk脚本怎么移植到Python,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。何时从 awk 转向 Python但是在某些方面,awk 的限制开始显现出来。它没有将文件分解为模块...
    99+
    2023-06-16
  • 移植Python到ARM9(S3C244
    来源:http://hi.baidu.com/vaico/blog/item/2d39d0c497b54da18326ac7d.html 我需要在Arm9的s3c2440 CPU上运行python,以下是我的编译过程。   host编译环境...
    99+
    2023-01-31
    Python
  • 移植Python到arm linux系统
    编译环境:ubuntu-12.0.4 编译器:gcc arm-arago-linux-gnueabi Python版本:3.6.2 Python安装包文件名:Python-3.6.2.tgz   整个过程分为三大步骤: 1. 直接编译py...
    99+
    2023-01-31
    系统 Python arm
  • Qt5代码怎么移植到Qt6
    本篇内容主要讲解“Qt5代码怎么移植到Qt6”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Qt5代码怎么移植到Qt6”吧!尝试下Qt5的代码是否可以正常在Qt6上编译通过,使用的我网易云代码,这...
    99+
    2023-07-05
  • 怎么将Java代码移植到Go中
    这篇文章主要讲解了“怎么将Java代码移植到Go中”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么将Java代码移植到Go中”吧!测试,代码覆盖率自动化测...
    99+
    2024-04-02
  • 使用2to3将代码移植到Python 3
    概述#几乎所有的Python 2程序都需要一些修改才能正常地运行在Python 3的环境下。为了简化这个转换过程,Python 3自带了一个叫做2to3的实用脚本(Utility Script),这个脚本会将你的Python 2程序源文件作...
    99+
    2023-01-31
    代码 Python
  • 移植python到小米路由器记录。
    最近抢了一个小米路由器,研究了一下,总的来说现在看起来功能还很少。现在比较有用的功能就是,远程下载功能,支持迅雷,电驴等,不过现在看电影啥的都是直接在线看的,基本上也很少用。检测连接的智能设备,这个功能可以随时查看是否有人曾网,当然也可以...
    99+
    2023-01-31
    小米 路由器 python
  • 怎么把数据库从MySQL移植到MemSQL
    本篇内容主要讲解“怎么把数据库从MySQL移植到MemSQL”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么把数据库从MySQL移植到MemSQL”吧!因为 ...
    99+
    2024-04-02
  • linux内核怎么移植
    本篇内容主要讲解“linux内核怎么移植”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux内核怎么移植”吧! 在linux中,...
    99+
    2023-02-23
    linux
  • sqlite如何迁移到mysql脚本
    这篇文章主要介绍了sqlite如何迁移到mysql脚本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。,具体代码如下所示:#! /u...
    99+
    2024-04-02
  • SQLite数据库怎么移植
    这篇文章主要讲解了“SQLite数据库怎么移植”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQLite数据库怎么移植”吧!在挂有小型系统的嵌入式产品中,移...
    99+
    2024-04-02
  • Python中MySQL数据迁移到MongoDB脚本的方法
    MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的...
    99+
    2022-06-04
    脚本 方法 数据
  • 怎么从0移植uboot支持exynos4412?
    这篇文章将为大家详细讲解有关怎么从0移植uboot支持exynos4412?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文主要目的是怎么从0编译和移植uboot,增加串口、网络、emmc等功能,让他支...
    99+
    2023-06-15
  • Python得到代码执行时间脚本怎么写
    Python得到代码执行时间脚本怎么写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。得到代码执行时间脚本:import timet0 = time.time()...
    99+
    2023-06-04
  • 怎么编写Python脚本
    本篇内容介绍了“怎么编写Python脚本”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Streamlit是第一个专门针对机器学习和数据科学团...
    99+
    2023-06-02
  • django怎么调用python脚本
    要在Django中调用Python脚本,可以按照以下步骤进行操作:1. 在Django项目的根目录下创建一个名为`scripts`的...
    99+
    2023-10-10
    django python
  • go怎么调用python脚本
    要在Go语言中调用Python脚本,可以使用os/exec包中的Command函数来执行Python脚本。 以下是一个简单的示例代码...
    99+
    2023-10-23
    go python
  • golang怎么调用python脚本
    在Golang中调用Python脚本可以使用os/exec包来执行外部命令。下面是一个简单的示例代码:gopackage maini...
    99+
    2023-10-20
    golang python
  • PYTHON测试脚本怎么写
    PYTHON测试脚本怎么写,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。#!/usr/bin/python# -*- coding: UTF-8 -*-#CHECK ORA...
    99+
    2023-06-04
  • Python高级脚本怎么写
    这篇文章主要介绍“Python高级脚本怎么写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python高级脚本怎么写”文章能帮助大家解决问题。1、Jpg转Png图片格式转换,以前小F可能第一时间想到...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作