在Python3中打印包含英语和日语文本的右对齐表列

时间:2018-10-05 02:02:59

标签: python string python-3.x formatting string-formatting

我有一列包含英语和日语字符的列,我需要以右对齐的方式打印该列。

这是我应该打印的列:

column = ["通常残業時間", "bbbbbbbbb", "tttt"]

通常的方法是获得最大的字符串长度并相应地进行调整,但问题是文本也使用日语,并且日语字符的宽度大于英语字符的宽度。在这种情况下,我应该如何比较字符串长度并进行相应打印?

这是必需的输出:

通常残業時間
 bbbbbbbbb
      tttt

我正在使用Python3。

3 个答案:

答案 0 :(得分:0)

问题是日语字符的宽度比英语字符以及空格要宽一些。' '

有针对这种情况的解决方案。您只需要计算这两种语言的宽度即可。

columns = ["通常残業時間", "bbbbbbbbb", "tttt"]
for i in column:
    print('|'.join(list(i)))

您可能会得到类似的东西。

通|常|残|業|時|間
b|b|b|b|b|b|b|b|b
t|t|t|t

您可以使用|查找宽度的关系。 在这里,我认为,这几乎就像是5个日语等于9个英语字符(请不要忘记减去|。)

获得宽度关系时。

那我想您可能知道如何计算它们应适合的长度。


对于上述错误或误导性建议,我们深表歉意。我意识到,除非找到不同的宽度来适应不同的语言字符,否则无法使其对齐。

但是我想我可能会发现一些与此相关的问题以及一些有用的信息。

Display width of unicode strings in Python [duplicate]

kitchen.text.display.textual_width 不幸的是,它仅适用于python2.7 ...

答案 1 :(得分:0)

似乎汉字(和中文)字母的长度是ascii的两倍。

因此,我将使用.encode('ascii')UnicodeEncodeError来检查行是否为ascii。 (基于此处的答案:https://stackoverflow.com/a/196391/837627

如果是ascii,我们将需要在行前面添加更多空间。

这是一个解决方案:

words = ["hhhh", "你你你你你你"]
max_length = 0

# Find the max length string in the array
# For kanji strings, the max length is doubled
for line in words:
    line_length = 0
    try:
        line.encode('ascii')
    except UnicodeEncodeError:
        line_length = 2 * len(line)
    else:
        line_length = len(line)
    if max_length < line_length:
        max_length = line_length

# Find the number of spaces to add by subtracting max line length by length of current line
# If current line is kanji, it is twice a ascii string length
for line in words:
    space = 0
    try:
        line.encode('ascii')
    except UnicodeEncodeError:
        space = max_length - (len(line)*2)
    else:
        space = max_length - len(line)
    print((' ')*space + line)

输出:

        hhhh
你你你你你你

第一行的长度为4个ASCII字符。第二行是6个中文字符长== 12个ascii字符长。因此,第一行前面需要12-4=8个空格(MONOSPACE !!!)。在StackOverflow中看起来不正确,但是由于等宽字体,在终端中它将对齐。

顺便说一句,我使用Python3编写了此解决方案。

答案 2 :(得分:0)

您可以在if (interactive()) { ui <- fluidPage( selectizeInput('email', 'Enter Email ID', choices = sam,options = list( placeholder = "Please select your Email ID", onInitialize = I('function() { this.setValue(""); }'))), textInput('fn', ' Enter your First Name'), textInput('ln', 'Enter your Last Name') ) server <- function(input, output, session) { observeEvent(input$email,{ check <- paste(input$email) fetchvalue <- sqldf("select * from dataset where `Email` == 'check'") first <- fetchvalue$First updateTextInput(session, "fn",value = first) }) } shinyApp(ui, server) } 的最后两项上使用r.just

column
column = ["通常残業時間", "bbbbbbbbb", "tttt"]

for idx, item in enumerate(column):
    if not idx:
        print(item)
    else:
        print(item.rjust(12))