Python:同一位置的新行

时间:2013-02-25 21:23:15

标签: python python-2.7 newline carriage-return

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

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

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

some text here
              and then it starts here

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

BTW,\r解决方案是否可移植?

P.S。 在我奇怪的情况下,我认为了解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)

其中儿童是一个清单。

每次打印儿童时,我希望它使用比最后一行更多的缩进。所以我想我无法预测我要打印的行之前的长度。

4 个答案:

答案 0 :(得分:5)

\r可能不是一个可移植的解决方案,它的呈现方式取决于你正在使用的任何文本编辑器或终端。在较旧的Mac系统上,'\r'被用作行尾字符(在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
>>> 

答案 1 :(得分: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

答案 2 :(得分: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)次。

答案 3 :(得分: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"])

将以您希望的方式打印文本行。