使用Python str.splitlines()处理尾随的换行符

时间:2018-08-24 19:26:26

标签: python string python-3.x

我正在实现图像上的文本绘制,并试图通过实现适当前进的“文本光标”来处理换行符。

我有一个处理尾随换行符的解决方案,但是它很丑陋且不符合Python规范。 Python的方式是什么?

这就是我现在正在做的事情(出于示例目的,简化了代码):

# string may contain zero or more newlines, may or may not terminate in a newline

def text(string):

    for line in string.splitlines():

        global x_cursor, y_cursor           # pixel location of cursor in image

        x_size_of_text = draw_one_line_of_text(line)
        old_x_cursor = x_cursor

        x_cursor = 0
        y_cursor += 20                      # lines are 20 pixels high

    if string[-1] != '\n':                  # if no trailing newline, undo final newline

        x_cursor = old_x_cursor + x_size_of_text
        y_cursor -= 20

在string.splitline()返回的每一行之后,我都要换行,然后,如果原始字符串没有以换行符结尾,请撤消换行。

这可行,但是很丑。正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以告诉splitlines在拆分时保留行尾(通过传递True作为可选参数)。

然后,如果没有换行符,请不要在每一行中转到下一行(显示时必须去除line

对于string.splitlines(True)中的行:

    global x_cursor, y_cursor           # pixel location of cursor in image

    x_size_of_text = draw_one_line_of_text(line.rstrip())
    old_x_cursor = x_cursor
    if line.endswith("\n"):
       x_cursor = 0
       y_cursor += 20                      # lines are 20 pixels high

这避免了最终测试,但引入了许多额外的测试和复杂性,仅用于处理最后一种情况。我认为坚持您的解决方案没有问题(这很丑陋,但速度很快-要求宽恕而不是获得许可)。

一个异议,而不是:

if string[-1] != '\n':  # if string is empty: Index out of range exception

我愿意:

if string and not string.endswith("\n"):

如果字符串为空,则测试将使程序崩溃。此外,没有什么要纠正的,因此请先测试空字符串。