2009-10-06 24 views
39

w PHP, mogę to zrobić:Jak wydrukować listę w Pythonie "ładnie"

echo '<pre>' 
print_r($array); 
echo '</pre>' 

w Pythonie, I obecnie tylko to zrobić:

print the_list 

Będzie to jednak spowodować duże jumbo danych. Czy istnieje sposób na dobre wydrukowanie go w czytelnym drzewie? (z wcięciami)?

Odpowiedz

92
from pprint import pprint 
pprint(the_list) 
+0

Jak ładny drukować do pliku? – Mawg

+2

Dlaczego po prostu nie użyć 'import pprint'? – clankill3r

+7

@ clankill3r, musisz użyć 'pprint.pprint (the_list)' zazwyczaj jest to kwestia osobistych preferencji. W tym przypadku wybrałem dodatkowe miejsce w linii importu. –

17

Masz na myśli coś takiego ...:

>>> print L 
['this', 'is', 'a', ['and', 'a', 'sublist', 'too'], 'list', 'including', 'many', 'words', 'in', 'it'] 
>>> import pprint 
>>> pprint.pprint(L) 
['this', 
'is', 
'a', 
['and', 'a', 'sublist', 'too'], 
'list', 
'including', 
'many', 
'words', 
'in', 
'it'] 
>>> 

...? Z twojego pobieżnego opisu, pierwszy moduł przychodzi mi do głowy standardowy moduł biblioteczny pprint; Jeśli jednak możesz opisać przykładowe dane wejściowe i wyjściowe (tak, że nie musisz uczyć się PHP, aby ci pomóc ;-), może nam się przydać bardziej szczegółowa pomoc!

14

Szybkie włamanie podczas debugowania, które działa bez konieczności importowania pprint będzie dołączenie do listy na '\n'.

>>> lst = ['foo', 'bar', 'spam', 'egg'] 
>>> print '\n'.join(lst) 
foo 
bar 
spam 
egg 
2

https://docs.python.org/3/library/pprint.html

Jeśli potrzebujesz tekstu (do korzystania z przekleństwami na przykład):

import pprint 

myObject = [] 

myText = pprint.pformat(myObject) 

Następnie myText zmienna będzie coś podobnie php var_dump lub print_r. Sprawdź w dokumentacji więcej opcji, argumentów.

11

Po prostu rozpakowując listę w argumentie funkcji drukowania i używając znaku nowej linii (\ n) jako separatora.

print (* lst, wrzesień = '\ n')

lst = ['foo', 'bar', 'spam', 'egg'] 
print(*lst, sep='\n') 

foo 
bar 
spam 
egg 
+0

Ładne, ale niestety dostępne tylko w Pythonie 3. –

0

jak inne odpowiedzi sugerują pprint moduł załatwia sprawę.
Jednak w przypadku debugowania, w którym może być konieczne umieszczenie całej listy w pliku dziennika, konieczne może być użycie metody pformat wraz z modułem logowanie wraz z pprint.

import logging 
from pprint import pformat 

logger = logging.getLogger('newlogger') 
handler = logging.FileHandler('newlogger.log') 

formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
handler.setFormatter(formatter) 

logger.addHandler(handler) 
logger.setLevel(logging.WARNING) 

data = [ (i, { '1':'one', 
      '2':'two', 
      '3':'three', 
      '4':'four', 
      '5':'five', 
      '6':'six', 
      '7':'seven', 
      '8':'eight', 
      }) 
     for i in xrange(3) 
     ] 

logger.error(pformat(data)) 

A jeśli musisz bezpośrednio zalogować się do pliku, należy podać strumień wyjściowy, używając słowa kluczowego stream. Ref

from pprint import pprint 

with open('output.txt', 'wt') as out: 
    pprint(myTree, stream=out) 

Zobacz Stefano Sanfilippo's answer

0

Jak inne odpowiedzi wspomniałem, pprint jest doskonałym modułem, który zrobi to, co chcesz. Jeśli jednak nie chcesz go importować i chcesz wydrukować wynik debugowania podczas programowania, możesz uzyskać przybliżone wyniki.

Niektóre z pozostałych odpowiedzi działają poprawnie dla łańcuchów, ale jeśli wypróbujesz je za pomocą obiektu klasy, spowoduje to błąd TypeError: sequence item 0: expected string, instance found.

Dla bardziej złożonych obiektów, upewnij się, że klasa ma __repr__ metodę, która drukuje informacje o właściwościach chcesz:

class Foo(object): 
    def __init__(self, bar): 
     self.bar = bar 

    def __repr__(self): 
     return "Foo - (%r)" % self.bar 

a następnie, gdy chcesz wydrukować wyjście, wystarczy map swoją listę do funkcji str tak:

l = [Foo(10), Foo(20), Foo("A string"), Foo(2.4)] 
print "[%s]" % ",\n ".join(map(str,l)) 

wyjścia:

[Foo - (10), 
    Foo - (20), 
    Foo - ('A string'), 
    Foo - (2.4)] 

Można też robić rzeczy, jak zastąpić metodę list__repr__ aby uzyskać formę zagnieżdżonych ładnej druku:

class my_list(list): 
    def __repr__(self): 
     return "[%s]" % ",\n ".join(map(str, self)) 

a = my_list(["first", 2, my_list(["another", "list", "here"]), "last"]) 
print a 

daje

[first, 
2, 
[another, 
list, 
here], 
last] 

niestety drugiego poziomu wcięcia ale do szybkiego debugowania to może się przydać.

Powiązane problemy