python格式化显示复杂对象例如字典

当想格式化显示一个字典,并且希望通过日志记录输出时,Python 提供了几种方法来实现这一目标。这里有两种常用的方式来格式化显示字典内容:

1 使用 format 方法直接格式化

你可以直接使用 format 方法将字典转换为字符串,这种方法简单直接:

logger.info('self.para: {}'.format(self.para))

这种方法会打印出字典的完整内容,但如果字典很大或包含复杂的数据结构,输出可能会变得很难阅读。Python 的 format 方法提供了一种非常灵活的方式来构造字符串,但它本身不提供直接的机制来“美化”或“格式化显示”一个字典,如添加缩进或特定格式排版。format 主要用于插入数据到字符串中的特定位置,并支持一定程度的格式化,例如数字的格式化显示,但对于字典或列表这类复合数据结构的美化显示,format 方法的功能较为有限。

2 使用 json.dumps 来美化输出

使用 json.dumps 可以让字典的输出更加易读,尤其是对于嵌套较深或数据结构较复杂的字典。这个方法可以让你自定义缩进,从而使输出更加结构化:

import json
logger.info('self.para: {}'.format(json.dumps(self.para, indent=4)))

这里,indent=4 表示使用4个空格缩进,你可以根据需要调整缩进的大小。
json.dumps 需要所有的键和值都是JSON类型兼容的。
这意味着所有键必须是字符串类型,而值则需要是以下类型之一:

  • 字符串 (str)
  • 数字 (int, float)
  • 布尔值 (True, False)
  • 其他字典 (dict)
  • 列表 (list)
  • 元组 (tuple)
  • None

如果字典中包含不兼容的类型,如 Python 的 setdatetime 对象、或其他任何不是上述类型的对象,使用 json.dumps() 时将会引发 TypeError

假设我们有一个包含多种数据类型的字典:

import json
from datetime import datetime# 创建一个包含多种数据类型的字典
data = {"name": "Alice","age": 30,"birthday": datetime.now(),  # datetime 对象不是 JSON 兼容类型"education": ["BSc", "MSc"],"married": True,"children": None,"pets": {"dogs": 2, "cats": 1},"preferences": set([1, 2, 3])  # set 也不是 JSON 兼容类型
}

尝试使用 json.dumps() 来序列化这个字典:

try:json_str = json.dumps(data)print(json_str)
except TypeError as e:print(f"Error: {e}")

输出将会是一个错误信息,因为 datetimeset 类型不能被 json.dumps() 序列化。

解决方案

对于不兼容的类型,你需要在调用 json.dumps() 之前将它们转换为兼容的类型,或者提供一个自定义的序列化函数:

转换不兼容的类型

data['birthday'] = data['birthday'].isoformat()  # 将 datetime 转换为字符串
data['preferences'] = list(data['preferences'])  # 将 set 转换为 list
json_str = json.dumps(data)
print(json_str)

使用 default 参数提供自定义序列化函数

def json_custom_serializer(obj):if isinstance(obj, datetime):return obj.isoformat()elif isinstance(obj, set):return list(obj)raise TypeError(f"Type {type(obj)} not serializable")json_str = json.dumps(data, default=json_custom_serializer)
print(json_str)

这样的处理确保了所有数据类型都可以被正确地序列化为 JSON 格式。

JSON(JavaScript Object Notation)最初是为 JavaScript 设计的一种数据交换格式。其设计目标是易于人类阅读和编写,同时也易于机器解析和生成。JSON 支持的数据类型有限,这是由其起源和设计目的决定的。以下是具体原因和考量:
JavaScript 兼容性:
JSON 的设计是基于 JavaScript 语言的对象字面量语法,因此它天然只支持那些在 JavaScript 中常见的数据类型。这包括了字符串、数字、布尔值、数组(在 JSON 中表现为列表)、对象(在 JSON 中表现为字典)以及 null(在 JSON 中表现为 None)。
跨语言交换数据:
JSON 被设计为一种语言独立的数据格式,目的是在不同编程语言和平台之间交换数据。支持的类型集团保持简单,可以确保在各种编程环境中都能无障碍地解析和生成,无论是 Python、Java、C# 等后端语言,还是 JavaScript 在前端的使用。
简洁性和易于实现:
JSON 的解析器和生成器可以相对简单地实现。限制数据类型有助于保持解析和生成过程的简洁性,降低实现的复杂度。这使得开发者能够轻松添加 JSON 支持到任何程序或服务中。
安全性:
避免复杂的数据类型如函数或执行代码,减少了安全风险。例如,与 XML 相比,JSON 没有支持执行代码的功能(如 XML 的实体和 CDATA 块可以用来嵌入代码),这减少了安全漏洞的风险。
序列化和反序列化的明确性:
限制数据类型确保在序列化(编码)和反序列化(解码)过程中,数据的表示是明确和一致的。例如,日期和时间在 JSON 中通常以 ISO 字符串格式表示,避免了关于时区和格式的混淆。

3 使用 pprint.pformat 来格式化打印

Python 的 pprint 模块提供了一个 pformat 函数,它可以生成一个格式化后的字符串表示形式,这对于复杂的数据结构尤其有用:

import pprint
logger.info('self.para: {}'.format(pprint.pformat(self.para, indent=4)))

json.dumps 类似,pprint.pformat 也允许你控制缩进,并能够更好地处理Python中的数据类型,比如 None, True, False 等。

4 自定义格式化函数

这个函数递归地处理字典,为每个嵌套的字典增加缩进,从而改善了字典的可读性。

def format_dict(d, indent=0):for key, value in d.items():if isinstance(value, dict):logger.info(' ' * indent + '{}: '.format(key))format_dict(value, indent + 4)else:logger.info(' ' * indent + '{}: {}'.format(key, value))format_dict(self.para)

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

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

相关文章

动态绑定和静态绑定

在C中,绑定(Binding)通常指的是将函数名(或其他标识符)与其实现(或值)关联起来的过程。这可以发生在编译时(静态绑定)或运行时(动态绑定)。以下是…

python多标签图像分类的图片相册共享交流系统vue+django

建立图片共享系统,进一步提高用户对图片共享信息的查询。帮助用户和管理员提高工作效率,实现信息查询的自动化。使用本系统可以轻松快捷的为用户提供他们想要得到的图片共享信息。 根据本系统的基本设计思路,本系统在设计方面前台采用了pytho…

区块链中MEV攻击:危害与防护策略

MEV攻击科普:揭秘、危害与防护策略 什么是MEV攻击及危害 在加密货币和区块链的世界里,MEV(最大化提取价值,Maximal Extractable Value)攻击是一种日益受到关注的现象,它涉及交易者、矿工或验证者利用信息…

Python 数据处理 合并二维数组和 DataFrame 中特定列的值

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 示例代码如下: import numpy as np import pandas as pddata {label: [1, 2, 3, 4]} df pd.DataFrame(data)values_array df[["label"]].values random_array np.random.ran…

Star15.3k,开源数据可视化分析工具项目

好东西来了,这是一个人人可用的开源数据可视化分析工具项目,V 哥迫不及待的要给大家推荐这个项目,帆软、Tableau 等商业 BI 工具的开源替代,已在 Github 上被 Star了15.3k了,大家一起来了解一下。自己搭建起来可用&…

Svelte框架:编译时优化的高性能前端框架

Svelte是一款新兴的前端框架,以其独特的编译时优化机制著称,能够在构建时将复杂的UI逻辑转换为高效的JavaScript代码,从而实现高性能的Web应用。本文将深入解析Svelte的架构、核心概念以及代码优化策略。 2024年礼包:2500G计算机…

【Git】Git在Gitee上的基本操作指南

文章目录 1. 查看 git 版本2. 从Gitee克隆仓库:3. 复制文件到工作目录:4. 将未跟踪的文件添加到暂存区:5. 在本地提交更改:6. 将更改推送到远程仓库(Gitee):7. Windows特定提示: 1. …

2024.5.12每日一题

LeetCode 吃掉N个橘子的最少天数 题目链接:1553. 吃掉 N 个橘子的最少天数 - 力扣(LeetCode) 题目描述 厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子。如果剩余橘子数 n 能被 2 …

数智化浪潮下,透视中建信息的“生态底色”

数智化浪潮正滚滚来袭,成为强劲的经济引擎。 根据国家统计局最新披露的数据,2023年中国数字经济核心产业增加值估计会超过12万亿元,占GDP比重10%左右。 对于众多企业而言,眼下思考的已经不是要不要布局数智化,而是如…

一个人结婚生娃后,就成熟了

文|洪生鹏 大家好,我是老洪。 今日偶然瞥见一个引人深思的话题——你认为成熟的标志是什么? 这个话题如同一股清泉,瞬间激起了我心中的波澜,让我忍不住想和大家分享一些个人的感悟。 青春,如同一首欢快的歌&#xff0c…

Golang | Leetcode Golang题解之第85题最大矩形

题目: 题解: func maximalRectangle(matrix [][]byte) (ans int) {if len(matrix) 0 {return}m, n : len(matrix), len(matrix[0])left : make([][]int, m)for i, row : range matrix {left[i] make([]int, n)for j, v : range row {if v 0 {continu…

Disk Map for Mac,让您的Mac更“轻”松

还在为Mac磁盘空间不足而烦恼吗?Disk Map for Mac来帮您轻松解决!通过独特的TreeMap视觉显示技术,让您一眼就能看出哪些文件和文件夹占用了大量空间。只需简单几步操作,即可快速释放磁盘空间,让您的Mac更“轻”松。快来…

整体安全设计

人员和资产的安全是当今许多组织的最高优先事项之一。随着暴力事件在美国各地盛行——枪击事件、袭击、内乱等——建筑物业主必须为其建筑物及其居住者的安全做好计划。 为了创造一个安全的环境,新设施或园区的安全设计必须超越基本的摄像头和访问控制设备&#xf…

图鸟UI vue3:基于Vue3和UniApp的酷炫简洁UI框架

引言 随着前端技术的不断发展,开发效率和用户体验成为了前端开发中的两大关键因素。为了提高开发效率和提供更好的用户体验,各种UI框架应运而生。其中,TuniaoUI作为一款基于Vue3和UniApp开发的UI组件库,以其酷炫简洁的设计和丰富…

如何通过iptables配置URL过滤黑名单?

正文共:1555 字 16 图,预估阅读时间:2 分钟 我们前面曾经简单介绍过URL过滤功能(URL过滤功能了解一下?),并且以H3C VFW为例简单配置了一下URL过滤功能。 首先回顾一下,URL过滤&#…

头歌C语言数据结构(队列的应用)

第1关:循环队列 任务描述 本关任务:编写一个循环队列,实现入队、出队操作,判断队空、队满等特殊情况。 相关知识 为了完成本关任务,你需要掌握:1.循环队列定义,2.入队、出队的定义&#xff…

深入理解C++中的Vector容器:用容器构建高效程序

文章目录 vector介绍vector常用的成员函数有关vector定义的函数vector的迭代器使用vector关于空间操作的成员函数vector的增删查改 总结 vector介绍 在C语言的库中包含有公共数据结构的实现,C的这个部分内容就是众所周知的STL(标准模版库)&a…

网络层(计算机网络谢希仁第八版)——学习笔记四

关于网络层的争论 争论的内容:网络层应该想运输层提供正阳的服务,是“面向连接的”还是“无连接”。 其实质就是:可靠交付应该交给谁负责?面向连接表示网络层负责可靠交付,无连接则是把这个任务交给运输层。 让网络层负…

C++笔记(STL标准库)

1.STL六大部件 容器 Containers分配器 Allocators:帮容器分配内存算法 Algorithms迭代器 Iterators:算法通过迭代器操作容器里的数据,是一种泛化的指针适配器 Adapters:修改或扩展已有类或函数的接口以满足特定的需求仿函数 Func…

Java13基础(StringBuilder和StringBuffer 包装类)

目录 一. StringBuilder和StringBuffer 扩容机制: 链式操作: 一些方法: 区别: 小结: 二. 包装类 创建对象: 自动装箱: 自动拆箱: 缓存池: 进制转换&#xff1…