2008-10-31 4 views
207

In Python, wenn ich sage,Wie verhindere ich, dass in Python-Drucken Zeilenumbrüche oder Leerzeichen hinzugefügt werden?

print 'h' 

ich den Brief h und eine neue Zeile zu bekommen. Wenn ich sage

print 'h', 

Ich bekomme den Buchstaben h und keine Zeilenschaltung. Wenn ich sage

print 'h', 
print 'm', 

Ich bekomme den Buchstaben h, ein Leerzeichen und den Buchstaben m. Wie kann ich verhindern, dass Python den Space druckt?

Die print-Anweisungen sind verschiedene Iterationen der gleichen Schleife, so dass ich nicht einfach den Operator + verwenden kann.

+58

Ich finde es weiterhin schockierend, dass Python für all seine anderen Vorzüge eine komplett gebrochene Druckaussage hat. –

+1

Meine aktuellen Experimente legen nahe, dass es kein * schleppendes * Leerzeichen gibt. Stattdessen ist es ein führendes Leerzeichen * genau dann, wenn * die vorhergehende Ausgabe ein 'print' war. Um sich selbst zu sehen, verschachteln Sie einige Aufrufe von 'print '.',' Und 'sys.stdout.write (',')'. Das ist verrückt. Warum sollte es sich daran erinnern, was vorher geschehen ist, und sein Verhalten dementsprechend ändern? –

Antwort

177

können Sie verwenden:

sys.stdout.write('h') 
sys.stdout.write('m') 
+19

Das hat super für mich funktioniert. Vergessen Sie nicht, eine sys.stdout.flush() zu machen, wenn Sie bereit sind, sie auf dem Bildschirm anzuzeigen, sonst wird sie in einem Puffer gespeichert und Sie werden es nicht sehen. Ich verwende dies, um ein visuelles Feedback zu geben, dass ein Skript immer noch läuft, wenn es eine lange Zeit oder für eine Schleife durchläuft. –

+6

Wenn das Tippen ein Problem ist, vergessen Sie nicht, dass Sie tun können: log = sys.stdout.write – andychase

+4

Um dies zu verwenden, müssen Sie 'sys' importieren, indem Sie' import sys' verwenden –

238

einfach einen Kommentar. In Python 3, werden Sie

print('h', end='') 

verwenden, um die Endlinie Terminator zu unterdrücken, und

print('a', 'b', 'c', sep='') 

die Leerzeichen Trennzeichen zwischen Elementen zu unterdrücken.

+59

Sie können 'from __future__ import print_function' in Python 2.6 – jfs

+14

aus __future__ import print_function bricht alle anderen print-Anweisungen mit der alten Syntax im selben Modul, Obwohl es eleganter ist als sys.stdout.write, kann es mehr Arbeit sein, die Änderung vorzunehmen. – James

42

Greg ist right-- können Sie sys.stdout.write verwenden

Vielleicht aber, sollten Sie Ihren Algorithmus Refactoring eine Liste von < Was immer zu akkumulieren > und dann

lst = ['h', 'm'] 
print "".join(lst) 
+0

als eine Variante dieses Idioms: 'print '' .join (Karte (str, [1, '+', 2, '=', 3]))' – Rhubbarb

20
Python 2.5.2 (r252:60911, Sep 27 2008, 07:03:14) 
[GCC 4.3.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> print "hello",; print "there" 
hello there 
>>> print "hello",; sys.stdout.softspace=False; print "there" 
hellothere 

Aber wirklich, sollten Sie sys.stdout.write direkt verwenden.

16

Der Vollständigkeit halber ist eine andere Möglichkeit, den Softspace-Wert nach dem Schreiben zu löschen. obwohl

import sys 
print "hello", 
sys.stdout.softspace=0 
print "world", 
print "!" 

druckt helloworld !

Mit stdout.write() ist wahrscheinlich bequemer für die meisten Fälle.

+0

nach [Dokumentation] (https: // docs.python.org/2/library/stdtypes.html#file.softspace) ** Dieses Attribut wird nicht verwendet, um die print-Anweisung zu steuern, sondern um es der Implementierung von print zu ermöglichen, den internen Status zu verfolgen. ** – kmad1729

24

oder verwenden Sie eine +, d.h .:

>>> print 'me'+'no'+'likee'+'spacees'+'pls' 
menolikeespaceespls 

So stellen Sie sicher, dass alle concatenate-able Objekte sind.

+4

oder Sie können sie konvertieren: print str (me) + str (nein) + str (likee) + str (Leerzeichen) + str (pls) – fengshaun

+2

Dies fügt immer noch einen Zeilenumbruch hinzu. –

9

Erneute Kontrolle über Ihre Konsole!Einfach gesagt:

from __past__ import printf 

wo __past__.py enthält:

import sys 
def printf(fmt, *varargs): 
    sys.stdout.write(fmt % varargs) 

dann:

>>> printf("Hello, world!\n") 
Hello, world! 
>>> printf("%d %d %d\n", 0, 1, 42) 
0 1 42 
>>> printf('a'); printf('b'); printf('c'); printf('\n') 
abc 
>>> 

Bonus Extra: Wenn Sie nicht print >> f, ... mögen, können Sie diese Kapriole zu fprintf erstrecken kann (f, ...).

+0

Ich liebte das: D. Eine gute Sache ist, dass es implizit das Problem von "" etwas% s "% x" tötet, wobei "x" ein Tupel ist ... – Dacav

13

Diese dumm aussehen, aber scheint die einfachste zu sein:

print 'h', 
    print '\bm' 
+1

Dies fügt immer noch einen Zeilenumbruch hinzu. –

1

Sie Druck wie die printf Funktion in C verwenden können

z.B.

print "% s% s" % (x, y)

+0

Dies fügt nachher noch einen Zeilenumbruch hinzu. Der OP wollte den Druck mehrere Male über eine Schleife aufrufen und keine Leerzeichen oder Zeilenumbrüche dazwischen haben. – Jonathan

5

In Python 2.6:

>>> print 'h','m','h' 
h m h 
>>> from __future__ import print_function 
>>> print('h',end='') 
h>>> print('h',end='');print('m',end='');print('h',end='') 
hmh>>> 
>>> print('h','m','h',sep=''); 
hmh 
>>> 

So print_function mit von __future__ Sie explizit das September und Ende parameteres einstellen der Druckfunktion.

-1
print("{0}{1}{2}".format(a, b, c)) 
+0

Dies fügt nachher noch einen Zeilenumbruch hinzu. Der OP wollte den Druck mehrere Male über eine Schleife aufrufen und keine Leerzeichen oder Zeilenumbrüche dazwischen haben. – Jonathan

+0

... aber es ist eine gute Idee, die Formatdokumentation zu lesen: [string - § Format String Syntax] (https://docs.python.org/2/library/string.html#format-string-syntax) und [Built-in Typen - § String Methoden - str.format] (https://docs.python.org/2/library/stdtypes.html#str.format) – Rhubbarb

7

Ich füge keine neue Antwort hinzu. Ich stelle nur die beste markierte Antwort in ein besseres Format. Ich kann sehen, dass die beste Antwort nach Bewertung sys.stdout.write(someString) verwendet. Sie können dies ausprobieren:

import sys 
    Print = sys.stdout.write 
    Print("Hello") 
    Print("World") 

nachgeben:

HelloWorld 

Das ist alles.

0

sys.stdout.write ist (in Python 2) die einzige robuste Lösung. Python 2 Drucken ist verrückt. Betrachten Sie diesen Code:

print "a", 
print "b", 

Dieses a b gedruckt wird, was Sie vermuten, dass es ein Leerzeichen gedruckt wird. Aber das ist nicht korrekt. Versuchen Sie stattdessen:

print "a", 
sys.stdout.write("0") 
print "b", 

Diese a0b gedruckt wird. Wie erklärst du das? Wo sind die Räume weg?

Ich kann immer noch nicht richtig ausmachen, was hier wirklich los ist. Könnte jemand meine beste Vermutung Blick über:

die Regeln herzuleiten Mein Versuch, wenn Sie ein , auf print Hinter haben:

Lassen Sie uns zunächst, dass print , (in Python 2) gedruckt wird, nicht davon ausgehen, Leerzeichen (Leerzeichen noch Zeilenumbrüche).

Python 2 jedoch, achten Sie darauf, wie Sie drucken - verwenden Sie print oder sys.stdout.write, oder etwas anderes? Wenn Sie zwei aufeinanderfolgende Aufrufe an print vornehmen, wird Python darauf bestehen, ein Leerzeichen dazwischen zu setzen.

0
import sys 
a=raw_input() 
for i in range(0,len(a)): 
     sys.stdout.write(a[i]) 
+2

Die angenommene Antwort von Greg Hewgill erwähnt bereits sys. stdout.write(). – Jonathan

0
print('''first line \ 
second line''') 

wird es

erste Zeile zweite Zeile

-2

Ich hatte das gleiche Problem vor, sobald ich einige Stellen aus einer Datei lesen wollte. Ich habe es so gelöst:

f = open('file.txt', 'r') 
for line in f: 
    print(str.split(line)[0]) 
+1

Dies ist eine sehr alte Frage mit vielen Antworten und Sie schlagen eine weitere Lösung vor, die nicht mit der gestellten Frage zusammenhängt. Ich schlage vor, einige neuere Fragen zu beantworten, die nicht schon mehr als ein Dutzend Antworten haben. – wedi

Verwandte Themen