2013-02-25 2 views
0

В Python 2.7, как можно достичь следующую особенность:Python: Новая линия в таком же положении

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

Вы попробовали это в Windows? – piokuc

+0

\ r возвращает каретку в начало строки, похоже, что это не то, что вы ищете – yurib

+0

@piokuc I havn't – dorafmon

ответ

0

Попробуйте использовать len («текст») * '', чтобы получить требуемое количество пробелов.

Чтобы получить портативный разрыв строки, используйте os.linesep

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

EDIT

Другой вариант, который может быть приемлемым в некоторых случаях перекрыть поток STDOUT.

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 
+0

извините, но это не может решить мой вопрос, потому что я не могу получить информацию о линии перед ней. – dorafmon

5

\r, вероятно, не портативное решение, как она визуализируется будет зависеть от любой текстовый редактор или терминал вы используете. На старых системах Mac, '\r' это использовалось как символ конца строки (На окнах это '\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 
>>> 

Это будет работать только, если все, что вы выводите на есть шрифт с фиксированной длиной символов, хотя я не могу думать ни о чем, что будет работать иначе

.

Редактировать, чтобы соответствовать изменившемуся Question

Хорошо, так что это совсем другой вопрос.Я не думаю, что есть какой-то способ сделать это с этим, начиная с точно положение, в котором последняя строка опустилась, если 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 
>>> 
+0

Извините, я немного изменил вопрос. – dorafmon

0

Вы можете использовать os.linesep, чтобы получить более портативный разрыв строки , а не только \r. Затем я использовал len() для вычисления длины 1-й строки, чтобы вычислить пробелы.

>>> 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) раз.

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"]) 

Что будет печатать строки текста так, как вы хотите.

Смежные вопросы