需求

  • 将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表格化输出的更多相关文章

  1. python json.dumps()函数输出json格式,使用indent参数对json数据格式化输出

    在python中,要输出json格式,需要对json数据进行编码,要用到函数:json.dumps json.dumps() :是对数据进行编码 #coding=gbkimport json dict ...

  2. python json.dumps()函数输出json格式,使用ensure_ascii参数对中文输入的支持

    在python使用过程中,输入中文,不能正常的输出,可以使用ensure_ascii参数来解决不能输入中文的问题 代码块: import json friends={"name": ...

  3. Python json数据中文输出问题。

    这个问题困扰了我好久好久,最后看了一眼官方文档,解决问题了. 问题描述:从web上获取的json数据,然后对应的保存到了python的类型中.再次输出这个数据时,中文总会变成\u1234这种形式. P ...

  4. python中json格式数据输出实现方式

    python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ...

  5. java 扁平化输出json所有节点key/value

    本章主要介绍用java实现扁平化输出json所有节点key/value(包含所有内层子节点) 1.json结构 目的输出bill_list下的datalist里的子节点key/value 2.实现代码 ...

  6. 基于python2.7通过boto3实现ec2表格化

    #!/usr/bin/env python import xlwt,xlrd,datetime,json,os,xlutils.copy a={ 'VpcPeeringConnection': { ' ...

  7. python JSON处理

    概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等. 反序列化:就是从存储区域(JSON,XML)读取反序列化对象的 ...

  8. python json基础学习01

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' import json #全称(javascript object  ...

  9. python大法好——python json

    Python JSON 本章节我们将为大家介绍如何使用 Python 语言来编码和解码 JSON 对象. JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, ...

  10. Python Json & Pickle模块

    用于序列化的两个模块 Json,用于字符串 和 python数据类型间进行转换 Pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...

随机推荐

  1. 《深入理解Java虚拟机》第三章读书笔记(三)——经典垃圾回收器

    系列文章目录和关于我 一丶概述 上图展示了 经典的垃圾回收器,其中Serial,ParNew,Parallel Scavenge(途中的Parallel) 作用在新生代Serial Old CMS,P ...

  2. Java8Stream流

    Stream流呢,以前我也有所了解,像一些面试题中也出现过,Java8的新特性,有一块就是这个Stream操作集合,而且在看一些项目中也使用的比较多.但总感觉自己学的一知半解,所以今天打算系统的过一下 ...

  3. 【学习日志】Cglib动态代理和JDK动态代理的对比

      Cglib JDK Proxy 实现方式 生成被代理类的子类 通过被代理类实现的接口+反射 速度 慢(曾经快于JDK Proxy,但JDK Proxy几次迭代后逐渐落后) 快 限制 被代理类不能是 ...

  4. python3中,isinstance() 函数

    #isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). #返回值:如果对象的类型与参数二的类型相同则返回True,否则返回False 使用isinstance函数的实 ...

  5. SRS视频流服务器初试

    目录 1.关于协议理解 2.快速开始 1.SRS安装 2.推流 3.拉流 注: 1)方式一:SRS网页播放器(推荐) 2)方式二:VLC播放器(需要下载,延迟高,不推荐) 1.关于协议理解 在前面的博 ...

  6. 罗姆BU32107EFV缩写词

    ADC Analog-to-Digital Converter Att Attenuation 衰减 AMix Analog Mixing AVol Analog Volume BPF Band-Pa ...

  7. git文件管理

    一.概念: git:分布式的版本管理工具Gitee(码云):是开源中国社区推出的代码托管协作开发平台,支持Git和SVN,提供免费的私有仓库托管.Gitee专为开发者提供稳定.高效.安全的云端软件开发 ...

  8. ORACLE数据库起不来

    由于意外导致数据库无法启动 首先切换到oracle用户,查看profile文件. su - oracle cat .bash_profile 然后进入数据库,查看挂载上 sqlplus "/ ...

  9. spark数据清洗

    spark数据清洗 1.Scala常用语法 运用maven创建项目,需要导入如下依赖: <dependency> <groupId>org.apache.spark</g ...

  10. GDOI2021游记

    \(\text{Day0}\) 4月9日抵达深圳耀华实验学校 宿舍在迷你公寓,竟然是女生公寓?!! 我想起了 \(b\) 站看到的一个 \(NOI\) 全国总决赛的纪录片(惊人的相似) 不过确实还行 ...