Chciałbym zrobić kilka instrukcji, które dają standardowe dane wyjściowe bez zauważania nowych linii pomiędzy instrukcjami.
Załóżmy, że mam:
for item in range(1,100):
print item
Wynik to:
1
2
3
4
.
.
.
Jak to wyglądać zamiast tego:
1 2 3 4 5 ...
Co więcej, czy można wydrukować pojedynczy numer na ostatnim numerze, aby na ekranie wyświetlała się tylko jedna liczba?
Odpowiedzi:
Zmień
print item
na:print item,
w Python 2.7print(item, end=" ")
w Python 3Jeśli chcesz wydrukować dane dynamicznie, użyj następującej składni:
print(item, sep=' ', end='', flush=True)
w Python 3źródło
'\n'
Znak jest pisany na końcu, chyba żeprint
instrukcja kończy się przecinkiem. Jest to jedyne działanie, jeśli instrukcja zawiera tylko słowo kluczoweprint
.flush
nie działafrom __future__ import print_function
.print(item, end=", ")
, dodaje również,
do ostatniego elementu, jak to zrobić, aby zapobiec dodawaniu,
go do ostatniego elementuOgólnie rzecz biorąc, można to zrobić za pomocą kodów kontrolnych terminala . Jest to szczególnie prosty przypadek, dla którego potrzebujesz tylko jednego znaku specjalnego: U + 000D CARRIAGE RETURN, napisanego
'\r'
w Pythonie (i wielu innych językach). Oto kompletny przykład oparty na kodzie:Niektóre rzeczy na ten temat mogą być zaskakujące:
\r
Idzie na początku łańcucha tak, że podczas gdy program jest uruchomiony, kursor zawsze będzie po numerze. To nie tylko kosmetyczne: niektóre emulatory terminali bardzo się zdezorientują, jeśli zrobisz to na odwrót.stdout.flush
to konieczne w niektórych systemach, w przeciwnym razie nie uzyskasz żadnych danych wyjściowych. Inne systemy mogą tego nie wymagać, ale nie wyrządza to żadnej szkody.Jeśli okaże się, że to nie działa, pierwszą rzeczą, którą powinieneś podejrzewać, jest to, że emulator terminala jest wadliwy. Vttest program może pomóc go przetestować.
Można wymienić
stdout.write
wprint
sprawozdaniu, a ja wolę nie mieszaćprint
z bezpośredniego użytkowania obiektów plików.źródło
flush()
zmusza plik do wysłania wszystkiego, co ma teraz do systemu operacyjnego. Jestem zaskoczony, że bez ciebie to działa - nie działało dla mnie, dopóki go nie dodałem.ncurses
z niego.sys.stdout.flush()
wydaje się być mendatory na mojeFreebsd
zPython 2.7
Służy
print item,
do tego, aby instrukcja print pomijała nowy wiersz.W Pythonie 3 jest to
print(item, end=" ")
.Jeśli chcesz, aby każda liczba wyświetlała się w tym samym miejscu, użyj na przykład (Python 2.7):
W Pythonie 3 jest to trochę bardziej skomplikowane; tutaj musisz spłukać,
sys.stdout
inaczej nic nie wydrukuje, dopóki pętla się nie skończy:źródło
Podobnie jak inne przykłady,
używam podobnego podejścia, ale zamiast spędzać czas na obliczaniu ostatniej długości wyjściowej itp.
Po prostu używam znaków ucieczki kodu ANSI, aby przejść z powrotem na początek linii, a następnie wyczyścić całą linię przed wydrukowaniem mojego aktualnego stanu wyjściowego.
Aby użyć w pętli iteracji, wystarczy wywołać coś takiego:
Zobacz więcej tutaj
źródło
Możesz dodać przecinek końcowy do instrukcji print, aby wydrukować spację zamiast nowego wiersza w każdej iteracji:
Alternatywnie, jeśli używasz języka Python 2.6 lub nowszego, możesz użyć nowej funkcji drukowania, która pozwoliłaby ci określić, że na końcu każdego drukowanego elementu nie powinna znajdować się spacja (lub pozwolić ci określić dowolny koniec chcieć):
Na koniec możesz pisać bezpośrednio na standardowe wyjście, importując je z modułu sys, który zwraca obiekt podobny do pliku:
źródło
zmiana
do
źródło
\033[K
kodzie? Chciałbym dowiedzieć się o nich więcej.print
już spłukuje wewnętrznie. Nie trzeba tego nazywać.print
różni się odsys.stdout.write()
miejsca, w którym musisz spłukiwać ekranMyślę, że proste połączenie powinno działać:
źródło
print ' '.join(str(x) for x in range(1, 10))
.Kolejna odpowiedź, której używam w wersji 2.7, gdzie właśnie wypisuję „”. za każdym razem, gdy działa pętla (aby wskazać użytkownikowi, że rzeczy nadal działają):
Drukuje „.” znaki bez spacji między nimi. Wygląda trochę lepiej i działa całkiem dobrze. \ B jest znakiem backspace dla tych, którzy się zastanawiają.
źródło
Tyle skomplikowanych odpowiedzi. Jeśli masz Python 3, po prostu umieść
\r
na początku wydruku i dodajend='', flush=True
do niego:To napisze
0 foo bar
, a potem1 foo bar
itd., W miejscu.źródło
print('\r' + filename + " ", end = '', flush=True)
Aby liczby się zastąpiły, możesz zrobić coś takiego:
Powinno to działać, dopóki numer jest wydrukowany w pierwszej kolumnie.
EDYCJA: Oto wersja, która będzie działać, nawet jeśli nie jest wydrukowana w pierwszej kolumnie.
Powinienem zauważyć, że ten kod został przetestowany i działa dobrze w Pythonie 2.5 w systemie Windows, w konsoli Windows. Według niektórych innych może być konieczne przepłukanie standardowego wejścia, aby zobaczyć wyniki. YMMV.
źródło
„Nawiasem mówiąc ... Jak go odświeżyć za każdym razem, aby wydrukować mi w jednym miejscu, wystarczy zmienić numer.”
To naprawdę trudny temat. Co za zack zasugerował (wysyłanie kodów sterujących konsoli), jest jednym ze sposobów na osiągnięcie tego.
Możesz użyć (n) przekleństw, ale działa to głównie na * nixes.
W systemie Windows (i tutaj jest interesująca część), o której rzadko wspomina się (nie rozumiem dlaczego) można używać powiązań Python z WinAPI ( http://sourceforge.net/projects/pywin32/ również domyślnie z ActivePython) - to nie jest tak ciężko i działa dobrze. Oto mały przykład:
Lub, jeśli chcesz użyć
print
(instrukcja lub funkcja, bez różnicy):win32console
moduł pozwala robić o wiele ciekawsze rzeczy z konsolą Windows ... Nie jestem wielkim fanem WinAPI, ale ostatnio zdałem sobie sprawę, że przynajmniej połowa mojej niechęci do niego była spowodowana pisaniem kodu WinAPI w C - powiązania pythonowe są znacznie łatwiejszy w użyciu.Wszystkie pozostałe odpowiedzi są oczywiście świetne i pytoniczne, ale ... Co jeśli chciałbym wydrukować na poprzedniej linii? Lub napisz tekst wielowierszowy, niż go wyczyść i napisz te same wiersze ponownie? Moje rozwiązanie to umożliwia.
źródło
dla Python 2.7
dla Python 3
źródło
źródło
Jeśli chcesz tylko wydrukować liczby, możesz uniknąć pętli.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 zajęło 21.1986929975ms
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 zajęło 491.466823551ms
źródło
map
.Najlepszym sposobem na osiągnięcie tego jest użycie
\r
postaciPo prostu wypróbuj poniższy kod:
źródło
W Pythonie 3 możesz to zrobić w ten sposób:
Wyjścia:
Krotka: Możesz zrobić to samo z krotką:
Wyjścia:
Inny przykład:
Wyjścia:
Możesz nawet rozpakować krotkę w ten sposób:
Wyjścia:
inna odmiana:
Wyjścia:
źródło
Przecinek na końcu instrukcji print pomija nowy wiersz.
ale to nie zastępuje.
źródło
Dla tych, którzy walczą tak samo jak ja, wymyśliłem następujące, które wydają się działać zarówno w Pythonie 3.7.4, jak i 3.5.2.
Rozszerzyłem zakres ze 100 do 1 000 000, ponieważ działa on bardzo szybko i możesz nie widzieć wyniku. Wynika to z tego, że jednym efektem ubocznym ustawienia
end='\r'
jest to, że końcowa iteracja pętli usuwa wszystkie dane wyjściowe. Potrzebna była dłuższa liczba, aby wykazać, że to działa. Ten wynik może nie być pożądany we wszystkich przypadkach, ale w moim przypadku był w porządku, a OP nie określił w ten czy inny sposób. Można to potencjalnie obejść za pomocą instrukcji if, która ocenia długość iterowanej tablicy itp. Kluczem do uruchomienia jej w moim przypadku było połączenie nawiasów"{}"
z.format()
. W przeciwnym razie to nie zadziałało.Poniżej powinno działać tak, jak jest:
źródło
Wyjście: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25, 22, 22, 29, 29, 30, 3, 3, 33,34,35,36,37,38,39,40, 41,42,43,44,45,47,48,49, 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74, 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,96,96,98
źródło
Lub jeszcze prościej:
end="\r"
nadpisze od początku [0:] pierwszego wydruku.źródło