在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)
其中儿童是一个清单。
每次打印儿童时,我希望它使用比最后一行更多的缩进。所以我想我无法预测我要打印的行之前的长度。
答案 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"])
将以您希望的方式打印文本行。