如何将Python库存查询接口返回的JSON数据转换为美观ASCII表格
Python API返回JSON转ASCII格式化表格实现方案
现有基础代码
import requests import xml.etree.ElementTree as ET import json def get_stock(sku): params = {'ItemId': sku} base_url = 'http://10.0.0.25/api/GetSku' response = requests.get(base_url, params=params) json_parsed = json.loads(response.content) if response.status_code == 200: return [item for item in response.json() if item['Site'] == "12"] else: return None def jprint(obj): text = json.dumps(obj, sort_keys=True, indent=4) print(text) # 注意:原调用参数为字符串,需加引号否则会触发语法错误 jprint(get_stock("101025HRLONDON"))
当前JSON输出格式
[ { "ItemId": "101025HRLONDON", "Site": "12", "Warehouse": "17", "availablePhysical": 1.0 }, { "ItemId": "101025HRLONDON", "Site": "12", "Warehouse": "33", "availablePhysical": 1.0 }, { "ItemId": "101025HRLONDON", "Site": "12", "Warehouse": "34", "availablePhysical": 1.0 } ]
期望输出效果
+----+------+----------------------+ | WH |aval. | ItemID | +----+------+----------------------+ | 17 | 1 | 101025HRLONDON | | 33 | 1 | 101025HRLONDON | | 34 | 1 | 101025HRLONDON | +----+------+----------------------+
具体实现方案
方案1:使用tabulate第三方库(推荐)
tabulate是专门用于生成格式化ASCII表格的Python库,支持多种表格样式,代码量极少,适配性高。
- 第一步:安装依赖
pip install tabulate - 第二步:替换原有打印逻辑即可
修改后完整代码如下:
import requests import json from tabulate import tabulate def get_stock(sku): params = {'ItemId': sku} base_url = 'http://10.0.0.25/api/GetSku' response = requests.get(base_url, params=params) if response.status_code == 200: return [item for item in response.json() if item['Site'] == "12"] else: return None def print_stock_table(stock_list): if not stock_list: print("无库存数据") return # 组装表格数据,做字段映射和类型转换 table_data = [ [item["Warehouse"], int(item["availablePhysical"]), item["ItemId"]] for item in stock_list ] # 定义表头 headers = ["WH", "aval.", "ItemID"] # 生成grid格式的表格,和要求的样式完全一致 print(tabulate(table_data, headers=headers, tablefmt="grid")) # 调用打印 stock_data = get_stock("101025HRLONDON") print_stock_table(stock_data)
方案2:纯原生实现(无第三方依赖)
如果环境不允许安装额外Python包,可以自己实现表格拼接逻辑,代码如下:
import requests import json def get_stock(sku): params = {'ItemId': sku} base_url = 'http://10.0.0.25/api/GetSku' response = requests.get(base_url, params=params) if response.status_code == 200: return [item for item in response.json() if item['Site'] == "12"] else: return None def print_stock_table(stock_list): if not stock_list: print("无库存数据") return # 配置列信息:表头、对应取值逻辑、列宽 columns = [ ("WH", lambda x: x["Warehouse"], 4), ("aval.", lambda x: str(int(x["availablePhysical"])), 6), ("ItemID", lambda x: x["ItemId"], 22) ] # 生成分隔线 separator = "+" + "+".join(["-" * col[2] for col in columns]) + "+" # 打印表头 print(separator) header_line = "|" + "|".join([col[0].ljust(col[2]) for col in columns]) + "|" print(header_line) print(separator) # 打印每行数据 for item in stock_list: line = "|" + "|".join([col[1](item).ljust(col[2]) for col in columns]) + "|" print(line) # 打印底部分隔线 print(separator) # 调用打印 stock_data = get_stock("101025HRLONDON") print_stock_table(stock_data)
该方案可以根据实际数据长度灵活调整列宽,只要修改columns配置里的列宽参数即可适配不同长度的内容。
内容的提问来源于stack exchange,提问作者Ghazi Mohammed
相关产品推荐
相关产品推荐

