【问题标题】:How to format python string based on byte length?如何根据字节长度格式化python字符串?
【发布时间】:2017-12-04 19:28:27
【问题描述】:

当输出包含非 ascii 字符时,我在格式化我的 python 输出时遇到问题。举个例子:

>>> persons = [['Anton',12], ['Jürgen',16], ['Bernd', 18]]
>>> for i in persons:
...     print '{0:10} {1:3}'.format(i[0], i[1])
...
Anton       12
Jürgen     16
Bernd       18

当然,我希望输出与第二个参数完美对齐,即

Anton       12
Jürgen      16
Bernd       18

如何使用.format() 方法实现我想要的输出?

我怀疑我的问题与计算字符串长度的方式有关,即字符长度与字节长度,

>>> len('Jürgen'.decode('utf-8'))
6
>>> len('Jürgen')
7 

但在这种情况下,我不知道如何指定正确的字符串格式。

当我在 Stack Overflow 上输入问题时,我什至可以直观地看到字符串“Anton”与“Jürgen”的颜色不同,这意味着后者可能不会被识别为“正常”字符串,但是什么我应该怎么做?

【问题讨论】:

  • 忽略您在此处看到的颜色。解析器试图语法高亮您的输出,就好像它是 Python 代码一样。这并不重要。
  • 从 UTF-8 解码,将所有内容格式化为 Unicode 字符串。
  • @MartijnPieters,如果你的意思是print '{0:10} {1:3}'.format(i[0].decode('utf-8').encode('utf-8'), i[1]),那还是不行……
  • @klopps 您仍然没有格式化为 unicode。
  • @klopps 您的格式字符串也必须是 Unicode; u'{0:10}...'.format()

标签: python formatting ascii


【解决方案1】:

使用 UTF-8 解码字符串并格式化为 Unicode:

>>> persons = [['Anton',12], ['Jürgen',16], ['Bernd', 18]]
>>> for i in persons:
...     print u'{0:10} {1:3}'.format(i[0].decode('utf-8'), i[1])
... 
Anton       12
Jürgen      16
Bernd       18

【讨论】:

    【解决方案2】:

    尝试将您的列表设置为:

    persons = [['Anton',12], [u'Jürgen',16], ['Bernd', 18]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多