0

在 python 2.7 中如何实现以下功能:

print "some text here"+?+"and then it starts there"

终端上的输出应如下所示:

some text here
              and then it starts here

我四处寻找,我认为\r应该做这项工作,但我试过了,它不起作用。我现在很困惑。

顺便说一句,该\r解决方案是否可移植?

PS 在我奇怪的情况下,我认为知道 prev 行的长度对我来说非常困难。所以有什么想法而不是使用它上面的线的长度吗?

==================================================== =================================

好的情况是这样的,我正在编写一个树结构,我想使用 __str__ 函数很好地打印出来

class node:
def __init__(self,key,childern):
    self.key = key
    self.childern = childern

def __str__(self):
    return "Node:"+self.key+"Children:"+str(self.childern)

其中 Children 是一个列表。

每次打印 Children 时,我都希望它比最后一行缩进一个。所以我想我无法预测要打印的行之前的长度。

4

4 回答 4

5

\r可能不是一个可移植的解决方案,它的呈现方式将取决于您使用的任何文本编辑器或终端。在较旧的 Mac 系统上,'\r'is 用作行尾字符(在 windows 上是'\r\n',在 linux 和 OSX 上是'\n'.

你可以简单地做这样的事情:

def print_lines_at_same_position(*lines):
    prev_len = 0
    for line in lines:
        print " "*prev_len + line
        prev_len += len(line)

使用示例:

>>> print_lines_at_same_position("hello", "world", "this is a test")
hello
     world
          this is a test
>>> 

这仅在您输出的任何字体具有固定字符长度的字体时才有效。我想不出任何其他的方法

编辑以适应更改的问题

好的,这是一个完全不同的问题。我认为没有任何方法可以从最后一行停止的位置开始,除非self.key有可预测的长度。但是你可以得到一些非常接近的东西:

class node:
    def __init__(self,key,children):
        self.key = key
        self.children = children
        self.depth = 0

    def set_depth(self, depth):
        self.depth = depth
        for child in self.children:
            child.set_depth(depth+1)

    def __str__(self):
        indent = " "*4*self.depth
        children_str = "\n".join(map(str, self.children))
        if children_str:
            children_str = "\n" + children_str
        return indent + "Node: %s%s" % (self.key, children_str)

然后只需将根节点的深度设置为 0,并在每次更改树的结构时再次执行此操作。如果您确切知道如何更改树,则有更有效的方法,您可能可以自己弄清楚:)

使用示例:

>>> a = node("leaf", [])
>>> b = node("another leaf", [])
>>> c = node("internal", [a,b])
>>> d = node("root", [c])
>>> d.set_depth(0)
>>> print d
Node: root
    Node: internal
        Node: leaf
        Node: another leaf
>>> 
于 2013-02-25T21:29:12.490 回答
0

您可以使用os.linesep来获得更便携的换行符,而不仅仅是\r. 然后我会len()用来计算第一个字符串的长度以计算空格。

>>> import os
>>> my_str = "some text here"
>>> print my_str + os.linesep + ' ' * len(my_str) + 'and then it starts here'
some text here
              and then it starts here

关键是' ' * len(my_str)。这将重复空格字符len(my_str)时间。

于 2013-02-25T21:31:19.313 回答
0

尝试使用 len("text") * ' ' 来获得所需的空白量。

要获得便携式换行符,请使用 os.linesep

>>> import os
>>> os.linesep
'\n'

编辑

在某些情况下可能适用的另一个选项是覆盖标准输出流。

import sys, os

class StreamWrap(object):

        TAG = '<br>' # use a string that suits your use case

        def __init__(self, stream):
                self.stream = stream

        def write(self, text):
                tokens = text.split(StreamWrap.TAG)
                indent = 0
                for i, token in enumerate(tokens):
                        self.stream.write(indent*' ' + token)
                        if i < len(tokens)-1:
                                self.stream.write(os.linesep)
                        indent += len(token)

        def flush(self):
                self.stream.flush()

sys.stdout = StreamWrap(sys.stdout)

print "some text here"+ StreamWrap.TAG +"and then it starts there"

这将为您提供如下结果:

>>> python test.py 
some text here
          and then it starts there
于 2013-02-25T21:26:20.200 回答
0

\r解决方案不是您正在寻找的,因为它是 windows 换行符的一部分,但在 mac 系统中它实际上是换行符。

您将需要如下代码:

def pretty_print(text):
    total = 0
    for element in text:
        print "{}{}".format(' '*total, element)
        total += len(element)

pretty_print(["lol", "apples", "are", "fun"])

它将按照您希望的方式打印文本行。

于 2013-02-25T21:33:09.150 回答