用f-string+sys.stdout.write定制“自己的writer”

news2024/11/16 21:33:27

f-string+sys.stdout.write,在python中“随意”我的输出。


(笔记模板由python脚本于2024年07月29日 08:09:35创建,本篇笔记适合喜欢python并有一定基础的coder翻阅)


【学习的细节是欢悦的历程】

  • Python 官网:https://www.python.org/

  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
    地址:https://lqpybook.readthedocs.io/


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室
等风来,不如追风去……


f-string+sys.stdout.write
定制自己的writer
(在python中“随意”我的输出)


本文质量分:

96 96 96

本文地址: https://blog.csdn.net/m0_57158496/

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ 定制自己的writer
    • 1、sys.stdout.write v s vs vs print
    • 2、sys.stdout.write是print的底层操作
    • 3、“定制”自己的writer
    • 4、f-string定制模板
    • 5、有色输出


◆ 定制自己的writer


1、sys.stdout.write v s vs vs print


  在Python中,sys.stdout.writeprint 函数在许多情况下可以产生相似的效果,因为它们都用于将输出发送到标准输出(通常是控制台或终端)。但是,它们之间有一些关键的区别:

  1. 自动换行

    • print 函数默认在输出的末尾添加一个换行符(\n),除非指定 end='' 参数。
    • sys.stdout.write 不会自动添加换行符,必须显式地写入换行符。

    例如:

    import sys
    
    print("Hello, World!")
    sys.stdout.write("Hello, World!\n")
    
    
  2. 参数处理

    • print 函数可以接受多个参数,并自动处理它们之间的空格分隔。
    • sys.stdout.write 只接受一个字符串参数,如果需要,你必须自己构建这个字符串。

    例如:

    
    print("Hello", "World!")  # 输出:Hello World!
    sys.stdout.write("Hello " + "World!\n")  # 输出:Hello World!
    
    
  3. 文件操作

    • print 可以通过 file 参数直接写入到任何文件对象。
    • sys.stdout.write 默认只写入到标准输出,但可以通过重新分配 sys.stdout 到一个文件对象来实现写入文件。

    例如:

    
    with open('example.txt', 'w') as f:
        print("Hello, World!", file=f)
    
    with open('example.txt', 'w') as f:
        sys.stdout = f
        sys.stdout.write("Hello, World!\n")
        sys.stdout = sys.__stdout__  # 恢复标准输出
    
    
  4. 性能

    • 在某些情况下,sys.stdout.write 可能比 print 有轻微的性能优势,因为 print 函数要处理更多的参数和自动格式化。


  总的来说,尽管 sys.stdout.writeprint 可以在某些情况下互换使用,但它们并不是同质同效的。根据具体的使用场景和需求,你应该选择最适合的那个。通常,print 函数因其易用性和多功能性而被广泛使用,而 sys.stdout.write 在需要更细粒度控制输出格式时可能更受欢迎。



回页目录


2、sys.stdout.write是print的底层操作


  “sys.stdout.write是print的底层操作”,可以说 printsys.stdout.write 的一种“个性定制”。在Python中,print 是一个高级的内置函数,它提供了更多的功能和方便的接口来处理输出。当您使用 print 函数时,Python解释器实际上在底层调用了 sys.stdout.write(以及可能的其他操作)来实现其功能。


以下是 print 的一些“个性定制”特性,这些特性在 sys.stdout.write 中是默认不提供的:

  1. 自动字符串转换print 会自动将非字符串对象转换为字符串。
  2. 自动添加空格print 在参数之间自动添加空格。
  3. 自动换行:默认情况下,print 在输出的末尾添加一个换行符。
  4. 文件支持print 允许您通过 file 参数直接写入文件,而不是标准输出。
  5. 结尾字符定制print 允许您通过 end 参数指定输出结尾的字符。

  在Python的早期版本中(例如Python 2)print 是一个语句而不是函数,其实现细节与现在有所不同。但从Python 3开始,print 被重新实现为一个函数,其背后确实是调用了 sys.stdoutwrite 方法来执行实际的输出工作。

  在Python源代码中,可以找到 print 函数的实现细节。在调用 print 时,解释器会执行一系列操作,最终调用 sys.stdout.write 来输出内容。以下是一个非常简化的示例流程:


def print(*args, sep=' ', end='\n', file=sys.stdout):
    output = sep.join(str(arg) for arg in args)
    file.write(output + end)

  在这个简化的示例中,print 函数首先将所有参数转换为字符串,并将它们用 sep 参数指定的分隔符连接起来。然后,它将结果字符串和 end 参数指定的结尾字符一起写入到 file 参数指定的文件对象中,默认是 sys.stdout

  因此,虽然 sys.stdout.writeprint 的一个底层操作,但 print 提供了更多的功能,使得它成为日常编程中更常用的输出方法。



回页目录


3、“定制”自己的writer


  一般情况下,python“官方”固化的sys.stdout.write,完全可以满足需求。当print不能实现“预期”时,最适宜的就是自己“定制”sys.stdout.write。

  这样子的理解是正确的。在大多数情况下,Python的 print 函数确实可以满足常见的输出需求,因为它提供了很多方便的特性,如自动换行、参数之间的空格分隔等。然而,当 print 函数无法满足特定的输出格式或性能要求时,使用 sys.stdout.write(而不是 sys.stdout.write,这里应该是 sys.stdout.write)来定制输出是一个合适的选择。


以下是一些可能需要使用 sys.stdout.write 的场景:

  1. 性能优化:在需要频繁输出大量数据时,sys.stdout.write 可能会比 print 函数提供更好的性能,因为它避免了 print 函数的额外开销。

  2. 精细控制输出:当需要精确控制输出的格式,例如不添加额外的空格或换行符时,sys.stdout.write 允许您直接写入指定的字符串。

  3. 二进制数据print 函数是为文本输出设计的,如果需要写入二进制数据到标准输出,使用 sys.stdout.buffer.write 会更合适。

  4. 多线程输出:在多线程环境中,直接使用 sys.stdout.write 可能需要更少的同步操作,因为它不会像 print 那样自动添加换行符,这可能导致线程间的输出交错。

  5. 与其他系统交互:当需要将输出发送到其他程序或系统时,可能需要更精细地控制输出,以符合外部系统的接口要求。


在使用 sys.stdout.write 时,需要注意以下几点:

  • 需要手动管理换行符
  • 需要确保所有非字符串类型的参数都被转换为字符串
  • 如果您希望输出后不立即刷新输出缓冲区,可能需要手动调用 sys.stdout.flush()

  因此,当 print 函数不能满足特定的需求时,sys.stdout.write 提供了一个更底层、更灵活的接口来自定义输出行为。这样子,就可以自由“定制”自己的writer



回页目录


4、f-string定制模板


  用f-string做模板用一条语句先行在sys.stdout.write前把文本处理成“自己想要的样子”,也是很方便。这是一个较好的方案。

  使用 f-string(格式化字符串字面量)来构建要输出的文本,然后使用 sys.stdout.write 来输出,确实是一个很好的方案。f-string 是 Python 3.6 及以上版本中引入的一种非常强大和灵活的字符串格式化方法,它允许你轻松地嵌入表达式到字符串字面量中,并且执行效率通常比其他字符串格式化方法(如 % 格式化或 str.format()要高。


以下是使用f-stringsys.stdout.write 的一个例子:

import sys

name = "Alice"
age = 30
message = f"Hello, {name}. You are {age} years old.\n"
sys.stdout.write(message)

在这个例子中,f-string 被用来构建一个包含变量 nameage 的消息字符串,然后使用 sys.stdout.write 将该字符串输出到标准输出。


以下是使用 f-string 作为模板的优点

  1. 易读性:f-string 提供了一种清晰、直观的方式来格式化字符串,使得代码更易于阅读和维护。

  2. 效率:f-string 在运行时编译为表达式,因此它们的执行速度通常比其他字符串格式化方法快。

  3. 灵活性:你可以轻松地在 f-string 中嵌入任意表达式,包括函数调用、算术运算等。

  4. 控制:使用 sys.stdout.write 允许你精确控制输出的行为,例如,不自动添加换行符,或者根据需要手动刷新输出缓冲区。

  因此,如果你需要更精细地控制输出格式,同时希望代码保持简洁和高效,使用 f-string 构建模板然后使用 sys.stdout.write 输出是一个非常好的方案。



回页目录


5、有色输出


  可以if os.name != 'nt’来过滤windows,非’nt’有色而’nt’原样。可以“区别对待”定制自己的writer。🤗🤗

  确实,可以使用 os.name 来检查当前操作系统,并根据操作系统类型来决定是否启用颜色输出。在 Python 中,os.name 的值通常是 'posix'(表示类Unix系统,如Linux和macOS)或者 'nt'(表示Windows系统)


以下是如何根据操作系统来定制您的my_writer函数的示例

import os
import sys

def my_writer(*args, sep=' ', end='\n', file=sys.stdout, flush=False, color=None):
    # 检查操作系统是否支持颜色输出
    if os.name != 'nt' and color:
        # 添加颜色控制字符
        color_start = f"\033[{color}m"
        color_end = "\033[0m"
    else:
        # Windows 或未指定颜色,不添加颜色控制字符
        color_start = ""
        color_end = ""

    # 使用 f-string 构建消息,并添加颜色控制字符(如果支持)
    message = f"{color_start}{sep.join(f'{arg}' for arg in args)}{color_end}{end}"

    # 使用 sys.stdout.write 写入消息
    file.write(message)
    
    # 如果 flush 参数为 True,则刷新输出缓冲区
    if flush:
        file.flush()

# 使用自定义的 my_writer 函数
my_writer("Hello", "World", sep='-', end='!\n', color='92')  # 绿色输出

在这个示例中,color 参数允许您指定一个 ANSI 颜色代码(例如 '92' 表示绿色)。函数会检查当前操作系统,如果操作系统不是 Windows (os.name != 'nt') 并且提供了颜色代码,则会在消息前后添加相应的颜色控制字符。


  这样,您就可以在不同的操作系统上“区别对待”,为非 Windows 系统提供彩色输出,而为 Windows 系统提供原样输出。这种方法使得您的 my_writer 函数更加灵活,可以根据运行环境来调整输出样式。🤗🤗



回页首


上一篇:  Python获取终端尺寸(os.get_terminal_size(),无差别获取当前终端长宽,让你为所欲)
下一篇: 



我的HOT博:

  本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有 7 7 7篇。

  • 001
    标题:让QQ群昵称色变的神奇代码
    (浏览阅读 5.9w )
    地址:https://blog.csdn.net/m0_57158496/article/details/122566500
    点赞:25 收藏:86 评论:17
    摘要:让QQ昵称色变的神奇代码。
    首发:2022-01-18 19:15:08
    最后编辑:2022-01-20 07:56:47

  • 002
    标题:Python列表(list)反序(降序)的7种实现方式
    (浏览阅读 1.1w )
    地址:https://blog.csdn.net/m0_57158496/article/details/128271700
    点赞:8 收藏:35 评论:8
    摘要:Python列表(list)反序(降序)的实现方式:原址反序,list.reverse()、list.sort();遍历,全数组遍历、1/2数组遍历;新生成列表,resersed()、sorted()、负步长切片[::-1]。
    首发:2022-12-11 23:54:15
    最后编辑:2023-03-20 18:13:55

  • 003
    标题:pandas 数据类型之 DataFrame
    (浏览阅读 9.7k )
    地址:https://blog.csdn.net/m0_57158496/article/details/124525814
    点赞:7 收藏:36 
    摘要:pandas 数据类型之 DataFrame_panda dataframe。
    首发:2022-05-01 13:20:17
    最后编辑:2022-05-08 08:46:13

  • 004
    标题:个人信息提取(字符串)
    (浏览阅读 8.2k )
    地址:https://blog.csdn.net/m0_57158496/article/details/124244618
    点赞:2 收藏:15 
    摘要:个人信息提取(字符串)_个人信息提取python。
    首发:2022-04-18 11:07:12
    最后编辑:2022-04-20 13:17:54

  • 005
    标题:Python字符串居中显示
    (浏览阅读 7.6k )
    地址:https://blog.csdn.net/m0_57158496/article/details/122163023
    评论:1

  • 006
    标题:罗马数字转换器|罗马数字生成器
    (浏览阅读 7.5k )
    地址:https://blog.csdn.net/m0_57158496/article/details/122592047
    摘要:罗马数字转换器|生成器。
    首发:2022-01-19 23:26:42
    最后编辑:2022-01-21 18:37:46

  • 007
    标题:回车符、换行符和回车换行符
    (浏览阅读 6.0k )
    地址:https://blog.csdn.net/m0_57158496/article/details/123109488
    点赞:2 收藏:3 
    摘要:回车符、换行符和回车换行符_命令行回车符。
    首发:2022-02-24 13:10:02
    最后编辑:2022-02-25 20:07:40


推荐条件 阅读量突破6.00k
(更多热博,请点击蓝色文字跳转翻阅)

  • 截屏图片
    在这里插入图片描述
      (此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)



回页首


老齐漫画头像

精品文章:

  • 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
  • OPP三大特性:封装中的property
  • 通过内置对象理解python'
  • 正则表达式
  • python中“*”的作用
  • Python 完全自学手册
  • 海象运算符
  • Python中的 `!=`与`is not`不同
  • 学习编程的正确方法

来源:老齐教室


◆ Python 入门指南【Python 3.6.3】


好文力荐:

  • 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
  • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
  • 靠谱程序员的好习惯
  • 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归

CSDN实用技巧博文:

  • 8个好用到爆的Python实用技巧
  • python忽略警告
  • Python代码编写规范
  • Python的docstring规范(说明文档的规范写法)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dotnet开发编译之争:Ahead-of-Time(AOT) vs Just-in-Time(JIT)谁才是未来最佳编译选择?

1. 前言 编译技术的选择对于现代应用程序的性能至关重要。在.Net开发平台下,选择合适的编译策略对于提升应用程序的响应速度、资源利用率以及最终用户体验有着不可忽视的影响。其中,Ahead-of-Time (AOT) 编译和 Just-in-Time (JIT) 编译是两种广泛采用的…

【编程工具使用技巧】VS如何显示行号

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《编程工具与技巧探索》 期待您的关注 目录 引言 一、VS编译器行号显示的基本步骤 1.打开VS与项目 2.进入选项设置 3.找到并…

Open3D 计算点到平面的距离

目录 一、概述 1.1原理 1.2实现步骤 1.3原理 二、代码实现 1.1关键函数 1.2完整代码 三、实现效果 3.1原始点云 3.2计算距离后赋色的点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新&#…

【更新2022】省级农业科技活动人员数测算 2009-2022无缺失

省级农业科技活动人员数测算数据在农业经济学、政策研究和农村发展规划等领域的论文研究中具有重要应用价值。首先,这些数据可用于分析省级农业科技活动的规模和结构变化,揭示不同地区在农业科技投入和产出方面的差异,为政府制定农业发展政策…

锅总浅析系统设计

如何进行系统设计?系统设计最佳实践有哪些?系统设计和软件工程有何区别?如何避免过度设计?学习书籍及软件工具推荐有哪些?前后端语言选型有哪些原则?考虑政策因素的系统设计步骤是怎样的? 带着这…

三维推:二维码生成与修改、加logo、设置有效期

进入后台,找到【二维码工具】下的【二维码在线生成】,可以看到,三维推支持网址、图片、音频、视频、文件以及模板生成二维码。 这里,我们以网址生成二维码为例来演示下,如何给二维码加logo、更改颜色等。 首先&#x…

操作系统---进程调度算法相关习题

例题1:某系统采用基于优先权的非抢占式进程调度策略,完成一次进程调度和进程切换的系统时间开销为1us。在T时刻就绪队列中有3个进程P1、P2和P3,其在就绪队列中的等待时间、需要的 CPU 时间和优先权如下表所示。 若优先权值大的进程优先获得CP…

Git基础概念一览:仓库、协议、原理、服务器搭建全解析

Git基础概念详解 一、引言 二、基础概念概览 三、安全通信与协议 四、Git 服务器搭建与操作 五、Git 工作流程与原理 六、Git 日志与操作 七、总结 一、引言 “ 掌握Git的基本概念是高效进行版本控制的第一步。本文将详细介绍如何创建本地和远程仓库,G…

【HarmonyOS4+NEXT】新建项目指南

🙋‍ 一日之际在于晨 ⭐本期内容:新建项目指南 🏆系列专栏:鸿蒙HarmonyOS4NEXT:探索未来智能生态新纪元 文章目录 创建项目项目结构概述运行项目Preview预览模拟器运行真机运行 ArkUI框架简介总结 创建项目 点击创建一…

撰写LabVIEW开发方案时,怎么结构清晰、内容详实?

撰写LabVIEW开发方案时,结构清晰、内容详实是至关重要的。以下是一些步骤和技巧,帮助你组织和编写一个高质量的LabVIEW开发方案: 1. 封面 项目名称公司名称日期作者 2. 目录 列出各章节及其页码 3. 摘要 项目概述:简要介绍项…

vue、react前端框架实现TodoList页面案例

原始TodoList网页(主要就是链接里网页应用ndex.html、styles.css、script.js ): https://blog.csdn.net/weixin_42357472/article/details/140657576 node、npn安装参考: https://blog.csdn.net/weixin_42357472/article/details/…

昇思25天学习打卡营第16天|GAN 图像生成指南:数据集和模型训练手册

目录 MindSpore 环境配置、MNIST 数据集下载及处理展开。 数据集可视化 隐码构造 模型构建 模型训练 效果展示 模型推理 MindSpore 环境配置、MNIST 数据集下载及处理展开。 首先,通过命令行操作安装特定版本的 MindSpore 库,并查看其版本。接着&a…

从零开始学习网络安全渗透测试之基础入门篇——(四)反弹SHELL不回显带外正反向连接防火墙出入站文件上传下载

一、反弹SHELL 反弹SHELL(Reverse Shell)是一种网络攻击技术,它允许攻击者在一个被入侵的计算机上执行命令,即使该计算机位于防火墙或NAT(网络地址转换)之后。通常,当攻击者无法直接连接到目标…

使用SpringEvent解决WebUploader大文件上传解耦问题

目录 前言 一、SpringEvent涉及的相关组件 1、 事件(Event) 2、事件监听器 3、事件发布器 二、WebUploader大文件处理的相关事件分析 1、事件发布的时机 2、事件发布的代码 三、事件监听器及实际的业务处理 1、文件上传处理枚举 2、文件上传监…

[红明谷CTF 2021]write_shell 1

目录 代码审计check()$_GET["action"] ?? "" 解题 代码审计 <?php error_reporting(0); highlight_file(__FILE__); function check($input){if(preg_match("/| |_|php|;|~|\\^|\\|eval|{|}/i",$input)){// if(preg_match("/| |_||p…

科普文:万字梳理31个Kafka问题

1、 kafka 是什么,有什么作用 2、Kafka为什么这么快 3、Kafka架构及名词解释 4、Kafka中的AR、ISR、OSR代表什么 5、HW、LEO代表什么 6、ISR收缩性 7、kafka follower如何与leader同步数据 8、Zookeeper 在 Kafka 中的作用&#xff08;早期&#xff09; 9、Kafka如何快…

软件测试的实质

一、软件缺陷定义 软件未实现产品说明书要求的功能软件出现了产品说明书指明不应该出现的错误软件实现了产品说明书未提到的功能&#xff1b;如罕见未实现产品说明书虽未明确提及但应该实现的目标软件难以理解、不易使用、运行速度慢&#xff0c;或者软件测试员认为最终用户会…

java——集合介绍【汇总】

一、集合的理解和好处 1.1、数组的不足 1、长度开始时必须指定&#xff0c;而且一旦指定&#xff0c;不能更改 2、保存的必须为同一类型的元素 3、使用数组进行增删&#xff0c;比较麻烦 1.2、集合 1、可以动态保存任意多个对象&#xff0c;使用比较方便! 2、提供了一系…

【前端 16】使用Ajax发送异步请求

Ajax 基础入门&#xff1a;实现异步请求 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。通过使用 Ajax&#xff0c;可以在后台与服务器交换数据&#xff0c;这意味着可以在不影响用户…