python json表格化输出
需求
- 将json数据以表格形式输出
- 超长文本换行输出
- 能显示中文
- 在linux终端输出
实现
首先数据的模样。既然是表格化输出,那必然传入的数据是一个数组(废话),如果一个项文本很长需要换行输出,那这个项所属的项组都要换行输出。
首先是处理json数据:
jd = json.loads(data)
这样产生的数据是一个字典列表,即:
[{'key0': '值5', 'key1': '值5', 'key2': '值5', 'key3': '值5', 'key4': '值5'},
{'key0': '值6', 'key1': '值6', 'key2': '值6', 'key3': '值6', 'key4': '值6'},
{'key0': '值7', 'key1': '值7', 'key2': '值7', 'key3': '值7', 'key4': '值7'},
{'key0': '值8', 'key1': '值8', 'key2': '值8', 'key3': '值8', 'key4': '值8'},
{'key0': '值9', 'key1': '值9', 'key2': '值9', 'key3': '值9', 'key4': '值9'}]
定义函数
def tabular_print(datum):
上面说了,咱们先对传进来的数据进行检查:
try:
if len(datum) == 0:
print('None.')
return
except TypeError:
print('None')
return
对于每个数据组,统一调用 limit_print(line) 函数来打印。
首先打印表头:
limit_print(keys)
然后打印数据
for item in datum:
val = []
for k in keys:
val.append(item[k])
limit_print(val)
以下是 limit_print 的实现,仅针对一个汉字是两倍字母宽度的情况。
# 在有限的宽度下进行输出,超长则换行
def limit_print(line):
flag = True
max_row_size = 20
cnt = 0
length = []
for s in line:
length.append(get_length(str(s)))
lst = [0 for _ in range(len(line))]
sz = [0 for _ in range(len(line))]
while flag:
sod = 0
for i in range(len(line)):
s = str(line[i])
n = length[i]
if n < max_row_size * cnt:
sod += 1
print(' ' * max_row_size, end='')
else:
if n > max_row_size * (cnt + 1):
lst[i], sz[i] = next_station(s, lst[i], sz[i], max_row_size * (cnt + 1))
print(' ' * (max_row_size * (cnt + 1) - sz[i]), end='')
else:
sod += 1
lst[i], sz[i] = next_station(s, lst[i], sz[i], n)
print(' ' * (max_row_size * (cnt + 1) - sz[i]), end='')
print(' ', end='')
if sod == len(line):
flag = False
cnt += 1
print()
print('-' * (max_row_size + 1) * len(line))
# 获取字符串在屏幕上显示的长度
def get_length(s) -> int:
res = 0
for i in s:
# 中文占两个单位宽度
if is_full_width(i):
res += 2
else:
res += 1
return res
# 确定换行位置
def next_station(s, idx, st, ed) -> (int, int):
while idx < len(s) and st < ed:
if is_full_width(s[idx]):
if st + 2 > ed:
return idx, st
else:
st += 2
else:
st += 1
print(s[idx], end='')
idx += 1
return idx, st
# 是否是全角符号
def is_full_width(s) -> bool:
if '\u4e00' <= s <= '\u9fa5':
return True
if '\u0f01' <= s <= '\uff60':
return True
if '\uffe0' <= s <= '\uffe6':
return True
return False
python json表格化输出的更多相关文章
- python json.dumps()函数输出json格式,使用indent参数对json数据格式化输出
在python中,要输出json格式,需要对json数据进行编码,要用到函数:json.dumps json.dumps() :是对数据进行编码 #coding=gbkimport json dict ...
- python json.dumps()函数输出json格式,使用ensure_ascii参数对中文输入的支持
在python使用过程中,输入中文,不能正常的输出,可以使用ensure_ascii参数来解决不能输入中文的问题 代码块: import json friends={"name": ...
- Python json数据中文输出问题。
这个问题困扰了我好久好久,最后看了一眼官方文档,解决问题了. 问题描述:从web上获取的json数据,然后对应的保存到了python的类型中.再次输出这个数据时,中文总会变成\u1234这种形式. P ...
- python中json格式数据输出实现方式
python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ...
- java 扁平化输出json所有节点key/value
本章主要介绍用java实现扁平化输出json所有节点key/value(包含所有内层子节点) 1.json结构 目的输出bill_list下的datalist里的子节点key/value 2.实现代码 ...
- 基于python2.7通过boto3实现ec2表格化
#!/usr/bin/env python import xlwt,xlrd,datetime,json,os,xlutils.copy a={ 'VpcPeeringConnection': { ' ...
- python JSON处理
概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等. 反序列化:就是从存储区域(JSON,XML)读取反序列化对象的 ...
- python json基础学习01
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' import json #全称(javascript object ...
- python大法好——python json
Python JSON 本章节我们将为大家介绍如何使用 Python 语言来编码和解码 JSON 对象. JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, ...
- Python Json & Pickle模块
用于序列化的两个模块 Json,用于字符串 和 python数据类型间进行转换 Pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...
随机推荐
- Stochastic Methods in Finance (1)
Bootcamp Topics related to measure theory. 略去,详见测度论专栏中的文章 Expectations 令 \(X\) 为 \((\Omega, \mathcal ...
- C# 处理实体类赋值(获取嵌套类型,支持list 自定义类型)
public static T AESEncrypt<T>(T obj) where T : class { if (obj == null) { return obj; } var pr ...
- Altium Designer v23.0.1.38图文详解
Altium Designer (AD) 最新安装河蟹教程 ,ltium designer 显著地提高了用户体验和效率,利用时尚界面使设计流程流线化,同时实现了前所未有的性能优化.使用64位体系结 ...
- FCoE简单介绍
目录 FCoE 使用前提 FCoE FCoE是一种融合网络技术,其目的是将FC帧封装到以太网帧中,实现以太网链路与光纤链路通信的功能. SAN一般指存储区域网络,FC SAN 有光纤组网,IP SAN ...
- yaml进阶用法
我们知道 json 是 yaml 的子集,作为超集的 yaml,必然有着很多与 json 不一样的特性,比如定义变量.引用.拼接等,下面来看看吧~ 为了方便和python的字典快速对比,我们直接使用y ...
- Prometheus&Alertmanager告警推送
前言 尽管可以通过可视化数据监控系统运行状态,但我们无法时刻关注系统运行,因此需要一些实时运行的工具能够辅助监控系统运行,当系统出现运行问题时,能够通知我们,以此确保系统稳定性,告警便是作为度量指标监 ...
- JZOJ 3226. 【HBOI2013】ALO
题目 网上自己搜 解析 区间异或很容易想到可持久化字典树 但本题的关键是如何高效率求出以某个数为区间最大值时这个区间的范围 依题我们知道区间最长可到比它第二大的位置(开区间) 所以我们如果能找到每个数 ...
- SnakeYaml的不出网反序列化利用分析
SnakeYaml的常见出网利用方式: !!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ...
- (原创)【B4A】一步一步入门05:控件、公有属性、水平锚定、垂直锚定(控件篇01)
一.前言 前面的教程,已经完整讲述了用B4A开发安卓APP从新建项目到编译发布的完整流程.从本篇开始,我们将会从B4A的细节处着手,一步一步掌握B4A. 从本篇开始的子系列为"控件篇&quo ...
- vs2019 代码片段管理
工具/代码片段管理 上面地址是vs内部代码片段,可以参考写自定义片段 写好的模板保存为.snippet文件,放到固定文件夹中,然后使用添加,直接找到文件夹添加即可 <?xml version=& ...