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://xiahunao.cn/news/2906583.html

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

相关文章

linux提权笔记

1 linux提权简介 Linux提权&#xff0c;简单来说&#xff0c;就是用户尝试获取高于其当前权限级别的系统访问权限的过程。在Linux系统中&#xff0c;root用户拥有最高的权限&#xff0c;能够执行任何操作&#xff0c;包括修改系统文件、安装软件、管理用户账户等。而普通用户通…

Java基础语法(五)| 方法

1. 方法概述 1.1 什么是方法 方法&#xff08;method&#xff09;完成某一个特定功能的代码块。 1.2 方法基本使用 将资料中给大家提供的打怪物发射炮弹重复的代码&#xff0c;把一些重复代码进行抽取&#xff08;封闭&#xff09;思想. 调用格式 方法名(); 注意&#xff1a; …

redis集群配置(精华版):哨兵模式

哨兵模式 概念单机单个哨兵多哨兵模式 动手实操1、环境准备2、配置sentinel.conf配置文件3、启动哨兵&测试4、SpringBoot测试哨兵模式故障转移功能 概念 主从切换技术的方法是&#xff1a;当主服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;这…

无人驾驶矿卡整体解决方案(5g物联网通信方案)

​无人驾驶矿卡是智能矿山的重要组成部分,通过远程操控替代人工驾驶,可以显著提高采矿效率和作业安全性。但要实现无人驾驶矿卡,需要依赖于可靠高效的通信网络,来传输现场视频、控制指令和运行数据。以下是某大型煤矿在部署无人驾驶矿卡时,所采用的星创易联物联网整体解决方案。…

【C++的奇迹之旅】C++关键字命名空间使用的三种方式C++输入输出命名空间std的使用惯例

文章目录 &#x1f4dd;前言&#x1f320; C关键字(C98)&#x1f309; 命名空间&#x1f320;命名空间定义&#x1f309;命名空间使用 &#x1f320;命名空间的使用有三种方式&#xff1a;&#x1f309;加命名空间名称及作用域限定符&#x1f320;使用using将命名空间中某个成员…

第十四届蓝桥杯JavaA组省赛真题 - 特殊日期

解题思路&#xff1a; 暴力秒了 public class Main {public static void main(String[] args) {int cnt 0;for (int i 1900; i < 9999; i) {for (int j 1; j < 12; j) {for (int k 1; k < days(i, j); k) {if (sum(i) sum(j) sum(k)) cnt;}}}System.out.print…

Nginx漏洞之未授权访问和源码泄漏漏洞处理

一、漏洞描述 某次安全扫描&#xff0c;发现某平台存在资源&#xff1a;未授权访问和源码泄漏&#xff1b;攻击者可能获取到网站的配置文件、敏感数据存储位置和访问凭证等信息。这意味着攻击者可以获得对网站的完全或部分控制权&#xff0c;进而进行恶意篡改、删除或添加恶意…

Linux-进程控制

&#x1f30e;进程控制【上】 文章目录&#xff1a; 进程控制 为什么要有地址空间和页表 程序的内存       程序申请内存使用问题 写时拷贝与缺页中断 父子进程代码共享       为什么需要写时拷贝       页表的权限位       缺页中断 退出码和错误码…

SpringBoot 登录认证(二)

SpringBoot 登录认证&#xff08;一&#xff09;-CSDN博客 SpringBoot 登录认证&#xff08;二&#xff09;-CSDN博客 SpringBoot登录校验&#xff08;三&#xff09;-CSDN博客 HTTP是无状态协议 HTTP协议是无状态协议。什么又是无状态的协议&#xff1f; 所谓无状态&…

毅速丨一体化压铸浪潮涌动 3D打印压铸模具将迎来广泛应用

近年来&#xff0c;特斯拉等车企的革新步伐引领着汽车制造业的变革&#xff0c;车身一体化压铸技术日益凸显其地位。这一技术不仅简化了车身制造的繁琐流程&#xff0c;更在供应链整合上实现了革命性的突破&#xff0c;为汽车制程带来了前所未有的经济性提升。 压铸技术&#x…

【面试那些事儿】浏览器键入网址到网页显示,期间发生了什么

当用户在浏览器中键入网址并按下回车键后&#xff0c;直到最终显示出完整的网页内容&#xff0c;这一过程中经历了哪些步骤呢&#xff1f; 这是一道经典的面试题&#xff0c;我们来看看具体有哪些阶段。 1. 解析URL 浏览器首先解析用户输入的URL&#xff0c;判断它的语法和协…

大话设计模式之策略模式

策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。这种模式定义了一族算法&#xff0c;将每个算法都封装起来&#xff0c;并且使它们之间可以互相替换。 在策略模式中&#xff0c;一个类的行为或其算法可以在运行时改变。这种模式包含以下角色&#xff1…

flume配置文件后不能跟注释!!

先总结&#xff1a;Flume配置文件后面&#xff0c;不能跟注释&#xff0c;可以单起一行写注释 报错代码&#xff1a; [ERROR - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:158)] Unable to deliver event. Exception follows. org.apache.flume.EventDel…

2024跨境电商新型选品方法

是不是有很多卖家一到旺季就为选品发愁&#xff1f;担心选错产品或是错过机会&#xff1f;今天就给大家打开思路&#xff0c;分享2024更好用的选品方法&#xff0c;解决大家的选品难题&#xff01; 2024跨境电商新型选品方法 1️⃣ 本土卖家观察法 利用社交媒体平台如Instagram…

Linux系统中安装一些常用的插件备用

Linux系统中安装一些常用的插件备用 1.安装wget yum -y install wget 2.安装vim yum -y install vim-enhanced 3.更换yum源为国内的阿里云源&#xff08;选择&#xff09; 1、备份CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.…

3d智慧火电厂可视化管理平台提升企业的经济效益

在数字化时代的浪潮中&#xff0c;我们迎来了一个崭新的概念——“智慧火力火电厂”。这一创新理念将前沿信息技术与传统的火力发电工艺完美融合&#xff0c;引领着电力生产与管理的深刻变革。 火电厂3D可视化展示系统融合了数字孪生、3D可视化、物联网、人工智能和大数据等尖端…

PN8034芯朋微PN8034SSC-R1B非隔离SOP7封装12V300MA电源芯片

PN8034集成PFM控制器及650V高雪州能力智能功本MOSFET&#xff0c;用于外图元器件极精简的小功本非隔离开关电源。PN8034内置高压启动模块&#xff0c;实现系统快速启动&#xff0c;超低待机功能。该芯片提供了完整的智能化保护功能&#xff0c;包括过流保护&#xff0c;欠压保护…

【Python】python2.7升级到python3.x

这里写目录标题 1.检查当前python版本2.下载最新的python3. pip安装4.系统默认python调整5 .错误 1.检查当前python版本 python -v2.下载最新的python python下载地址&#xff1a; wget https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz进行解压 tar -xvf P…

设计模式——结构型——外观模式Facade

处理器类 public class Cpu {public void start() {System.out.println("处理器启动了...");} } 内存类 public class Memory {public void start() {System.out.println("内存启动了...");} } 硬盘类 public class Disk {public void start() {Syste…

接口自动化测试框架:Junit5+RestAssured+Allure

需求分析 需求点需求分析通过 yaml 配置接口操作和用例后续新增接口和测试用例只需要编写 yaml 文件即可实现。可以支持接口间的参数传递具有参数依赖的接口可以进行变量的抽取和参数赋值。支持全局、用例维度的变量存储比如时间截命名法中要用到的时间截后缀。支持用例软断言…