Python中如何简便地格式化输出dict内容?
代码贴过来会严重变形,简化了内容,伪代码式表达问题。。。, 例子:
例子:
makeData = {'D2_make_time':'32',
'D4_make_seq':'32',
'D16_make_zaijianum':'32',
'D2_make_time':'32',
'D9_make_carteam':'韵达',
'D11_make_goodteam':'A16'}
一般输出:
print(('|生产日:' + makeData['D2_make_time'].strip()),
'|产 次:' + makeData['D4_make_seq'].strip(),
'|在架数:' + makeData['D16_make_zaijianum'].strip(),
'|车 队:' + makeData['D9_make_carteam'].strip(),
'|货 队:' + makeData['D11_make_goodteam'].strip())
会这样:
|生产日:32 |产 次:32 |在架数:32 |车 队:SASNCKJP |货 队:ECMCDJEH
|生产日:32 |产 次:32 |在架数:32 |车 队:NAAKSE |货 队:ZKFGKFRTYKJJ
|生产日:32 |产 次:32 |在架数:32 |车 队:XXMEWQOOPKMU |货 队:IRTYNVSSMY
|生产日:32 |产 次:32 |在架数:32 |车 队:VBSKTHJNMM |货 队:DNFG
|生产日:32 |产 次:32 |在架数:32 |车 队:AERKJUI |货 队:QMSCGNYR
我想输出的比较规范一些,如果能长成这个样子就好了。。。
|生产日:32 |产 次:32 |在架数:32 |车 队:SASNCKJP |货 队:ECMCDJEH
|生产日:32 |产 次:32 |在架数:32 |车 队:NAAKSE |货 队:ZKFGKFRTYKJJ
|生产日:32 |产 次:32 |在架数:32 |车 队:XXMEWQOOPKMU |货 队:IRTYNVSSMY
|生产日:32 |产 次:32 |在架数:32 |车 队:VBSKTHJNMM |货 队:DNFG
|生产日:32 |产 次:32 |在架数:32 |车 队:AERKJUI |货 队:QMSCGNYR
我试过:
a = makeData['D2_make_time'].strip()
print(('|生产日:' + {}).format(a),
'|产 次:' + makeData['D4_make_seq'].strip(),
'|在架数:' + makeData['D16_make_rangqiu'].strip(),
'|车 队:' + makeData['D9_make_hometeam'].strip(),
'|货 队:' + makeData['D11_make_visiteam'].strip())
pccharm 会提示 format()只接受 str 类型,而不接受 dict 类型,那么也没必要再试%s 的 print 方法了吧?
Python中如何简便地格式化输出dict内容?
fill?
# 直接使用json.dumps()最方便
import json
data = {"name": "张三", "age": 25, "skills": ["Python", "Java"]}
# 基本格式化(缩进2空格)
print(json.dumps(data, indent=2, ensure_ascii=False))
# 输出结果:
# {
# "name": "张三",
# "age": 25,
# "skills": [
# "Python",
# "Java"
# ]
# }
# 如果只需要简单查看,用pprint也行
from pprint import pprint
pprint(data, width=30)
json.dumps()的indent参数控制缩进,ensure_ascii=False让中文正常显示。pprint()自带的格式化也挺实用。
总结:用json.dumps()加indent参数最省事。
pprint 了解下
对于字符串, 可以使用 ljust 方法, 这个方法进行左对齐, 同时用空格补齐剩下的空位
比如’abc’.ljust(5), 得到的就是 'abc ’ , 后面有 2 个空格
还有你的代码格式, 可以这样
makeData = {
‘D2_make_time’:‘32’,
‘D4_make_seq’:‘32’,
‘D16_make_zaijianum’:‘32’,
‘D2_make_time’:‘32’,
}
当一行写不完的时候, 左括号后面不要写代码, 直接换行
优点的话, 主要是方便. 因为直接写代码, 下面几行的缩进, 不一定是 4 个空格的整倍数了
还有一点就是如果注释某一行数据, 如果是第一行数据注释, 会比较麻烦
使用这种换行, 会更整齐
你 print 的括号里, 也可以这样
print(
‘|生产日:’ + makeData[‘D2_make_time’].strip(),
‘|生产日:’ + makeData[‘D2_make_time’].strip(),
‘|生产日:’ + makeData[‘D2_make_time’].strip(),
)
大概这样
好好看看文档 format 怎么用
format 解包 dict 就行了,或者直接实现__str__
tab 字符不就是干这事的嘛
pprint +1
另外建议改为 dict constructor, 更直观, 并且 IDE 友好
makeData = dict(
D2_make_time=‘32’,
D4_make_seq=‘32’,
D16_make_zaijianum=‘32’,
D2_make_time=‘32’,
D9_make_carteam=‘韵达’,
D11_make_goodteam=‘A16’
)
另外你 dict 的 keyword 重复了
占位符啊
output_template = ‘|生产日:%-5s|产 次:%-5s|在架数:%-5s|车 队:%-5s|货 队:%-5s’
%-5s,长度小于 5 的自动向右补全空格
PrettyTable<br>import prettytable as pt<br><br>## 按行添加数据<br>tb = pt.PrettyTable()<br>tb.field_names = ["City name", "Area", "Population", "Annual Rainfall"]<br>tb.add_row(["Adelaide",1295, 1158259, 600.5])<br>tb.add_row(["Brisbane",5905, 1857594, 1146.4])<br>tb.add_row(["Darwin", 112, 120900, 1714.7])<br>tb.add_row(["Hobart", 1357, 205556,619.5])<br><br>print(tb)<br><br>+-----------+------+------------+-----------------+<br>| City name | Area | Population | Annual Rainfall |<br>+-----------+------+------------+-----------------+<br>| Adelaide | 1295 | 1158259 | 600.5 |<br>| Brisbane | 5905 | 1857594 | 1146.4 |<br>| Darwin | 112 | 120900 | 1714.7 |<br>| Hobart | 1357 | 205556 | 619.5 |<br>+-----------+------+------------+-----------------+<br>
感觉这个跟 pandas 差不多了,楼主可以考虑 pd.DateFrame.from_dict 然后打印
维护性奇差无比
用 .format() 或者是 f"" 来格式化输出吧……
用库的话prettytable 和 pandas 看起来都不错。
tab 还真不行,如果字符串之间的长度差超过了 1 个\t 的长度,就会彻底乱掉
str.ljust 和 rjust 才是王道,谁用谁知道!
受教了, 没考虑超出的情况

