我从网上提取数据,并希望将其与终端窗口中的表格对齐。在大多数情况下,我可以将文本对齐,但是当文本包含某些符号或外来字符时,事情会变得混乱。我该如何处理这些字符?以下是第三行输出问题的示例:
>>> items = "Apple tree", "Banana plant", "Orange 으르", "Goodbye"
>>> values = 100, 200, 300, 400
>>> for i, v in zip(items, values):
... print "%-15s : %-4s" % (i, v)
...
Apple tree : 100
Banana plant : 200
Orange 으르 : 300
Goodbye : 400
>>>
注意:我正确引用了所有项目。这里的"Orange"
结束引号在Stack Overflow上没有正确显示,但它们在终端窗口中显示正常。
更新:我已经为此问题添加了赏金。我正在寻找一种解决方案,可以在没有太多额外代码的情况下实现,也无需使用外部库。它也适用于python 2.7+和3.x(测试版本并应用不同修复的条件会没问题)。此外,它不需要任何额外的系统配置或更改字体或更改标准Debian / Ubuntu安装的任何终端设置。
答案 0 :(得分:4)
可以使用Unicode数据中的East Asian width属性来标识这些特定字符的特殊行为。从Programmatically tell if a Unicode character takes up more than one character space in a terminal获取建议并使用该值进行对齐:
#!/usr/bin/python3
import unicodedata
items = "Apple tree", "Banana plant", "Orange 으르", "Goodbye"
values = 100, 200, 300, 400
for i, v in zip(items, values):
eawid = len(i) + sum(1 for v in i if unicodedata.east_asian_width(v) == 'W')
pad = ' ' * (15 - eawid)
print("%s%s : %-4s" % (i, pad, v))
给出:
Apple tree : 100
Banana plant : 200
Orange 으르 : 300
Goodbye : 400
如果您的浏览器对这些字符使用1.5宽字形,则可能显示未对齐;在我的终端中,plan
与으르
的宽度完全相同。
这里的语法是Python 3,但相同的技术在2.7中起作用。