Python基础:标准库 -- pprint (数据美化输出)

1. pprint 库 官方文档

pprint --- 数据美化输出 — Python 3.12.2 文档

pprint — Data pretty printer — Python 3.12.2 documentation

2. 背景

处理JSON文件或复杂的嵌套数据时,使用普通的 print() 函数可能不足以有效地探索数据或调试应用程序。下面通过一个例子说明说明使用 print() 的弊端。

首先,使用 urllib 发出请求以获取数据。这里提供了两组代码,第一组含配置代理部分,第二组代码直接使用 urllib.request.urlopen。

  • 代理(英语:Proxy,也称网络代理)是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接:本机 ----代理IP----访问的网站(服务器)。

  • urllib 提供 urllib.request.ProxyHandler() 方法可动态设置代理IP池

需要配置代理时:

import urllib.request
import urllib.parse
import jsonurl = "https://jsonplaceholder.typicode.com/users"# 如果代理网站需要提供用户名和密码,注意密码含有特殊字符时要进行url编码
username = '****'
encoded_password = urllib.parse.quote("****") 
proxies ={"https": "****代理网站IP****"
}handler = urllib.request.ProxyHandler(proxies)
opener = urllib.request.build_opener(handler)
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url).read()
result = json.loads(response)
print(result)

 不需要配置代理时:

from urllib import request
import jsonresponse = request.urlopen("https://jsonplaceholder.typicode.com/users")
json_response = response.read()
users = json.loads(json_response)

打印结果(内容较长此处仅截取部分作为展示):

输出结果并不友好,是很长的一堆,不能帮助开发者理解数据的结构。

3. pprint 函数:初阶

pprint 用于以漂亮的方式打印数据,它属于是Python标准库,无需单独安装,使用时只需导入它的pprint() 函数:

from pprint import pprintpprint(result)

打印结果(内容较长此处仅截取部分作为展示):

pprint 的输出结果有合适的缩进,能够帮助开发者可视化分析数据结构。如果你想尽可能少地输入,pprint() 有一个别名 pp(),它的行为方式与 pprint 完全相同。

from pprint import pprint, pp# pprint(result)
pp(result)

 4. pprint 函数:进阶

pprint() 将在 stream 上打印 object 的格式化表示形式,indent 等参数用于设置数据结构的格式化形式,即以何种方式被展示。

4.1 参数概述

  • stream:一个 file-like object,表示调用 write() 方法时,输出内容被写入的位置(to which the output will be written by calling its write() method)。默认为 sys.stdout,如果 stream 和 sys.stdout 均为 None,则 pprint() 将静默地返回。
  • indent:指定要为每个缩进层级添加的缩进量,默认为 1,一个空格字符。
  • depth:控制可被打印的缩进层级数量。如果要打印的数据结构层级过深,则其所包含的下一层级将用 ... 替换。 默认对于被格式化对象的层级深度无限制。
  • width:指定输出中每行所允许的最大字符数,默认为 80。 如果一个数据结构无法在宽度限制之内被格式化,将显示尽可能多的内容。
  • compact:影响长序列(列表、元组、集合等等)的格式化方式。如果 compact 为True,则每个输出行格式化时将在 width 的限制之内尽可能地容纳多个条目。 如果 compact 为 False 则序列的每一项将格式化为单独的行。默认为 False。
  • sort_dicts:如果为 True,字典在格式化时将基于键进行排序,否则它们将按插入顺序显示。默认为 True。
  • underscore_numbers:如果为 True,整数在格式化时将使用 _ 字符作为千位分隔符,否则不显示下划线。默认为 False。

4.2 参数详解

depth:深度

indent:缩进

注:在这两个示例中,左花括号 { 被算为第一个键的缩进单位。在第一个示例中,第一个键的开始单引号紧跟在 { 之后,中间没有任何空格,因为缩进默认设置为1。

当存在嵌套时,缩进应用于行内的第一个元素,后续元素与第一个元素对齐。

如果将缩进设置为4,第一个元素将缩进四个字符,而第一个元素的嵌套内容将缩进超过八个字符,它的缩进是从第一个键的末尾开始的。

width:宽度

默认情况下,pprint() 每行最多只能输出80个字符,可以通过传入width参数来自定义此值。

pprint() 将努力将内容放在一行上,如果数据结构的内容超过了这个限制,那么它将在新的一行上打印当前数据结构的每个元素。width 的原则是在保证输出内容的可读性的前提下,尽可能地限制每行的宽度。这可以帮助我们在打印输出时避免过多的换行。

如果将宽度设置为较低的值,例如3,依然会得到美观的结果,这样做的主要效果是:每个数据结构都将在单独的行上显示。

如果需要分割某个字符,pprint 会避免从中间分割字符串,那样会影响阅读,在当前的例子中,pprint 在空格处进行分割。

compact:Bool,是否采用紧凑模式

compact 参数则指定了是否使用紧凑模式,如果 compact 为 True,则输出的格式会更加紧凑,否则会更加易读。

from pprint import pprintmylist = [(i, i+1) for i in range(100)]
print(mylist)
pprint(mylist, width=60)
pprint(mylist, width=60, compact=True)

 

stream:输出位置

默认情况下,pprint() 的输出位置与 print() 相同,具体来说,指向 sys.stdout。不过,可以通过 stream 参数,将其重定向到任何文件对象或 logging 日志对象。

with open("output.txt", mode="w") as file_object:pprint(result, stream=file_object)

sort_dicts:Bool,字典是否需要排序(keys 首字母按字母表顺序排序)

pprint(result, sort_dicts=False)

打印结果:

默认情况下,pprint() 将按字母顺序对键进行排序(sort_dicts = True),这能够保证每次打印时,输出的内容都是一样的。如果将 sort_dicts 设置为 False,字典是无序的,从理论上讲,每次打印时字典的键的顺序可能不同。

underscore_numbers:Bool,长数字是否需要下划线分隔符

注:某些版本直接调用 pprint() 时,使用这个参数有可能报错,后续的版本会解决。

5. pformat() 函数:输出字符串

代码示例-1:

from pprint import pformat, pprintresult_string = pformat(result[0], width=50)
print(result_string)

打印结果-1:

代码示例-2

from pprint import pformataddress = pformat(result[0]["address"])
print(address)chars_to_remove = ["{", "}", "'"]
for char in chars_to_remove:address = address.replace(char, "")
address = address.replace(",\n ", "\n")
print(address)

打印结果-2:

6. isreadable函数 和 isrecursive 函数

  • isreadable 函数:输出布尔值, 表示是否可通过 eval 重构对象值,此函数对于递归对象总是返回 False。
  • isrecursive 函数:输出布尔值, 表示 object 是否需要递归的表示。

代码示例:

from pprint import pprint, isreadable, isrecursive# 正常字典
pprint(result[0])
print(isreadable(result[0]))
print(isrecursive(result[0]))
print('\n')# 递归对象
stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
stuff.insert(0, stuff)
pprint(stuff)
print(isreadable(stuff))
print(isrecursive(stuff))

打印结果:

再举一个递归场景的例子:

from pprint import pprintA = {}
B = {"link": A}
A["link"] = B
print(A)
# {'link': {'link': {...}}}
pprint(A)
# {'link': {'link': <Recursion on dict with id=2747052595392>}}

字典 A 存在循环引用,永远无法得到最终结果,因而也无法完成打印。处理这样的数据时,Python 的常规 print() 将缩写输出,pprint() 能够显式地通知用户这是一种递归表示,并提供字典的ID。

7. PrettyPrinter类

除了直接调用 pprint 函数,还可以创建 PrettyPrinter 的实例,该实例具有已定义的默认值,在需要的时候,调用实例的 .pprint() 方法即可。

from pprint import PrettyPrinterdata_dict = {'name': 'John', 'age': 30, 'city': 'New York', 'hobbies': ['reading', 'coding', 'swimming']}
mylist = [(i, i+1) for i in range(50)]pp = PrettyPrinter(indent=2, width=80, compact=True, sort_dicts=False)
pp.pprint(data_dict)
pp.pprint(mylist)

打印结果:

8. 参考文档

已解决urllib模块设置代理ip_urllib2.request 设置代理-CSDN博客

Prettify Your Data Structures With Pretty Print in Python – Real Python

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#自定义最大化、最小化和关闭按钮

目录 1.资源文件 2.读取资源文件中的图片 3.WindowState属性 4. 示例 用户在制作应用程序时&#xff0c;为了使用户界面更加美观&#xff0c;一般都自己设计窗体的外观&#xff0c;以及窗体的最大化、最小化和关闭按钮。本例通过资源文件来存储窗体的外观&#xff0c;以及最…

计算机网络常见题(持续更新中~)

1 描述一下HTTP和HTTPS的区别 2 Cookie和Session有什么区别 3 如果没有Cookie,Session还能进行身份验证吗&#xff1f; 4 BOI,NIO,AIO分别是什么 5 Netty的线程模型是怎么样的 6 Netty是什么&#xff1f;和Tomcat有什么区别&#xff0c;特点是什么&#xff1f; 7 TCP的三次…

Ipython与Jupyter之间的关系

IPython 和 Jupyter 之间的关系可以从它们的历史和目标中得到很好的解释。IPython&#xff08;Interactive Python&#xff09;最初是由 Fernando Prez 于 2001 年创建的&#xff0c;旨在提升 Python 的交互式计算体验。它提供了一个强大的交互式 Python shell 和一个面向高效计…

android studio忽略文件

右键文件&#xff0c;然后忽略&#xff0c;就不会出现在commit里面了 然后提交忽略文件即可

SpringMvc之映射器HandlerMapping

简介 在springmvc的处理流程中&#xff0c;第一步就是查询请求对应的映射器&#xff0c;然后组装成处理器链处理请求&#xff0c;本文意在梳理该过程 重要实现 HandlerMapping是一个接口&#xff0c;该接口用于通过HttpServletRequest寻找对应的处理器&#xff0c;接口介绍如下…

【管理咨询宝藏59】某大型汽车物流战略咨询报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏59】某大型汽车物流战略咨询报告 【格式】PDF 【关键词】HR调研、商业分析、管理咨询 【核心观点】 - 重新评估和调整商业模式&#xff0c;开拓…

C语言与sqlite3入门

c语言与sqlite3入门 1 sqlite3数据类型2 sqlite3指令3 sqlite3的sql语法3.1 创建表create3.2 删除表drop3.3 插入数据insert into3.4 查询select from3.5 where子句3.6 修改数据update3.7 删除数据delete3.8 排序Order By3.9 分组GROUP BY3.10 约束 4 c语言执行sqlite34.1 下载…

Python 垃圾回收和弱引用(Weakref)

Python中的赋值语句是建立变量名与对象的引用关系&#xff0c;多个变量可以引用同一个对象&#xff0c;当对象的引用数归零时&#xff0c;可能会被当作垃圾回收。而弱引用即可以引用对象&#xff0c;又不会阻止对象被当作垃圾回收&#xff0c;因此这个特性非常适合用在缓存场景…

如何在 Oracle 中使用 CREATE SEQUENCE 语句

在本文中&#xff0c;我们将讨论 Oracle CREATE SEQUENCE 语句&#xff0c;其主要目的是提供一种可靠的方法来生成唯一且连续的数值&#xff0c;通常用于数据库表中的主键字段。此功能对于维护数据完整性和效率、确保不同记录之间的标识符有序分配尤其重要。从本质上讲&#xf…

Linux 常用命令(1)

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;Linux 随笔集合 …

经典永不过时 Wordpress模板主题

经得住时间考验的模板&#xff0c;才是经典模板&#xff0c;带得来客户的网站&#xff0c;才叫NB网站。 https://www.jianzhanpress.com/?p2484

服务器中有g++,但是查询不到,Command ‘g++‘ not found

有gcc但是查询不到g&#xff0c;gcc版本为9.5.0 (base) zyICML:~$ g -V Command g not found, but can be installed with: apt install g Please ask your administrator. 突然就出现这个问题&#xff0c;导致detectron装不上&#xff0c;现在有时间了专门研究下怎么解决 这…

软件测试基础理论、测试用例及设计方法、易混淆概念总结【软件测试】

一.软件测试基础理论 1.软件定义 软件是计算机系统中与硬件相互依存的一部分&#xff0c;包括程序、数据以及与其相关文档 的完整集合。 程序是按事先设计的功能和性能要求执行的指令序列&#xff1b; 数据是使程序能正常操作信息的数据结构&#xff1b; 文档是与程序开发、维…

【Docker】Docker安全与最佳实践:保护你的容器化应用程序

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

Elasticsearch 向量搜索

目标记录 ["你好&#xff0c;我的爱人","你好&#xff0c;我的爱妻","你好&#xff0c;我的病人","世界真美丽"] 搜索词 爱人 预期返回 ["你好&#xff0c;我的爱人","你好&#xff0c;我的爱妻"] 示例代码…

STM32之HAL开发——串口配置(源码)

串口收发原理框图&#xff08;F1系列&#xff09; 注意&#xff1a;数据寄存器有俩个一个是收一个是发&#xff0c;但是在标准库或者HAL库中没有特别区分开来是俩个寄存器&#xff01; USART 初始化结构体详解 HAL 库函数对每个外设都建立了一个初始化结构体&#xff0c;比如 …

芒果YOLOv8改进145:全新风格原创YOLOv8网络结构解析图

&#x1f4a1;本篇分享一下个人绘制的原创全新风格 YOLOv8网络结构图 感觉搭配还行&#xff0c;看着比较直观。 该专栏完整目录链接&#xff1a; 芒果YOLOv8深度改进教程 订阅了专栏的读者 可以获取一份 <可以自行修改 / 编辑> 的 YOLOv8结构图修改源文件 YOLOv8结构图…

Tomcat配置https

前言&#xff1a;本文内容为实操记录&#xff0c;仅供参考&#xff01; 一、证书 CA证书申请下载不赘述了。 二、上传证书 进入tomcat根目录&#xff0c;conf同级目录下创建cert文件夹&#xff0c;并将证书两个文件上传到该文件夹&#xff1b; 三、编辑conf/server.xml文件 ① …

macOS Sonoma 14.4.1 (23E224) 正式版发布,ISO、IPSW、PKG 下载

macOS Sonoma 14.4.1 (23E224) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 2024 年 3 月 26 日凌晨&#xff0c;macOS Sonoma 14.4.1 更新修复了一个可能导致连接到外部显示器的 USB 集线器无法被识别的问题。它还解决了可能导致 Java 应用程序意外退出的问题&#xff0c;并修…

FPGA高端项目:解码索尼IMX327 MIPI相机转HDMI输出,提供FPGA开发板+2套工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 6、工程源码…