पायथन में एक ही लाइन पर कई प्रिंट


229

मैं एक स्क्रिप्ट चलाना चाहता हूं, जो मूल रूप से इस तरह एक आउटपुट दिखाता है:

Installing XXX...               [DONE]

वर्तमान में, मैं Installing XXX...पहले प्रिंट करता हूं और फिर प्रिंट करता हूं[DONE]

हालाँकि, मैं अब प्रिंट करना चाहता हूं Installing xxx...और[DONE] एक ही लाइन पर।

कोई विचार?



1
इस प्रश्न के उत्तर में उल्लेख नहीं है कि कभी-कभी आप लाइन को खाली करना चाहते हैं, देखें: stackoverflow.com/questions/45263205
ideasman42

जवाबों:


284

आप printआयात किए बिना ऐसा करने के लिए कथन का उपयोग कर सकते हैं sys

def install_xxx():
   print "Installing XXX...      ",

install_xxx()
print "[DONE]"

printलाइन के अंत में अल्पविराम printएक नई लाइन जारी करने से रोकता है (आपको ध्यान देना चाहिए कि आउटपुट के अंत में एक अतिरिक्त स्थान होगा)।

पायथन 3 सॉल्यूशन
चूंकि ऊपर पायथन 3 में काम नहीं करता है, आप इसके बजाय ऐसा कर सकते हैं (फिर, आयात किए बिना sys):

def install_xxx():
    print("Installing XXX...      ", end="", flush=True)

install_xxx()
print("[DONE]")

प्रिंट फ़ंक्शन एक endपैरामीटर को स्वीकार करता है जो चूक करता है "\n"। इसे एक रिक्त स्ट्रिंग पर सेट करना पंक्ति के अंत में एक नई पंक्ति जारी करने से रोकता है।


1
यह पूरी तरह से काम करता है। अब तक केवल स्टडआउट समाधान देखा था। यह जानकर बहुत अच्छा लगा।
प्रोमेथियस

5
यदि आपके पास प्रिंट और समय लेने वाली कार्रवाई (सभी एक ही फ़ंक्शन / इंडेंटेशन स्तर में) है, तो यह काम नहीं करता है। कार्रवाई शुरू होने से पहले, कोई आउटपुट नहीं है और इसके समाप्त होने के बाद आउटपुट पूरे दिखाई देता है
Paddre

2
यह संभवतः पूरी प्रक्रिया के लिए OS द्वारा पूर्ववर्ती आउटपुट बफरिंग का एक कार्य है, जो एक अजगर-विशिष्ट समस्या नहीं है। अजगर-विशिष्ट वर्कअराउंड के लिए stackoverflow.com/questions/107705 देखें ।
कई

13
एक नई रेखा के बिना, आप शायद बफर को स्पष्ट रूप से फ्लश करना चाहते हैं। print("...", end="", flush=True)पायथन 3 में उपयोग करें , पायथन 2 में एक sys.stdout.flush()कॉल जोड़ें ।
मार्टिन पीटर्स

7
अजगर 3.x में आप एक "\ r" जोड़ना चाहेंगे जो मुद्रित लाइन वी.एस. को समाप्त करने के लिए इसे समाप्त करने के लिए जोड़ देगाprint("Progress: {}%".format(var), end="\r", flush=True)
जॉन

103

आप बस इसका उपयोग कर सकते हैं:

print 'something',
...
print ' else',

और आउटपुट होगा

something else

द्वारा overkill करने की कोई जरूरत नहीं है import sys। अंत में अल्पविराम के प्रतीक पर ध्यान दें।

print("some string", end="");अंत में नई लाइन डालने के लिए पायथन 3+ । और पढ़ेंhelp(print);


3
ध्यान दें कि इस विधि का उपयोग करके दो स्थान हैं
एथेनजिक्स

1
यह सबसे सरल और सबसे कुशल उत्तर है।
gixxer

जब प्रिंट के तर्क कोष्ठक में होते हैं तो यह काम नहीं करता है। यह काम करता है: <प्रिंट "हैलो" ,; प्रिंट ("हैलो")> लेकिन यह काम नहीं करता है <प्रिंट ("हैलो"); प्रिंट ("हैलो")>
मयंक जायसवाल

@MayankJaiswal यह परेंस के साथ काम करता है। प्रिंट ('हैलो'),
drglove

1
printसमारोह में अजगर 2 वीएस 3 में थोड़ा अलग वाक्यविन्यास है।
बोल्डनिक

52

आपको बैकस्पेस ' \ r ' या ' \ x08 ' का उपयोग करना चाहिएकंसोल आउटपुट में पिछले स्थान पर वापस जाने के ') का

अजगर 2+:

import time
import sys

def backspace(n):
    sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back   

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(s)                     # just print
    sys.stdout.flush()                      # needed for flush when using \x08
    backspace(len(s))                       # back n chars    
    time.sleep(0.2)                         # sleep for 200ms

अजगर 3:

import time   

def backline():        
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print(s, end='')                        # just print and flush
    backline()                              # back to the beginning of line    
    time.sleep(0.2)                         # sleep for 200ms

यह कोड एक लाइन पर 0% से 100% तक गिना जाएगा। अंतिम मूल्य होगा:

> python test.py
100%

इस मामले में फ्लश के बारे में अतिरिक्त जानकारी यहां दी गई है: अजगर ऐसे बयान क्यों छापते हैं जिनमें 'अंत =' तर्क होते हैं, जबकि लूप में भिन्न व्यवहार होता है?


1
स्पष्ट करने के लिए, ऐसा लगता है कि इस उदाहरण में टिप्पणी-आउट कोड पायथन 2 के लिए है, और गैर-टिप्पणी वाली पंक्तियाँ अजगर 3 के लिए हैं
कछुए हैं प्यारा

1
पाइथन में बाइट लाइनें ठीक काम करेंगी। 3. यदि आप '\ x08' का उपयोग बैकस्पेस के रूप में करते हैं, तो आपको आउटपुट स्ट्रीम को फ्लश करने की आवश्यकता है - प्रिंट ((b '\ x08' * n) .decode (), end = '', flush =। सच)
वादिम ज़िनकुक

1
गाड़ी वापसी '\ r' लाइन की शुरुआत में वापस जाती है, इसलिए '* n' अनावश्यक है
bjnortier

43

का उपयोग करें sys.stdout.write('Installing XXX... ')और sys.stdout.write('Done')। इस तरह, आपको नई लाइन को हाथ से जोड़ना होगा "\n"यदि आप प्रिंट कार्यक्षमता को फिर से बनाना चाहते हैं। मुझे लगता है कि सिर्फ इसके लिए शाप का उपयोग करना अनावश्यक हो सकता है।


4
मैं व्यक्तिगत रूप से उच्च मतदान वाले के लिए इस समाधान को पसंद करता हूं क्योंकि यह __future__आयात या इस तरह के किसी भी चीज़ पर भरोसा करने की आवश्यकता के बिना python2.x और python3.x पर ठीक उसी तरह काम करता है।
एमजीसिलसन

17

जवाब में से कोई भी मेरे लिए काम नहीं किया क्योंकि वे एक नई लाइन का सामना करने तक रुक गए थे। मैंने एक साधारण सहायक लिखा है:

def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

इसका परीक्षण करने के लिए:

import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

"हैलो" नींद से पहले स्क्रीन पर प्रिंट आउट और फ्लश करेगा। उसके बाद आप मानक प्रिंट का उपयोग कर सकते हैं।


1
धन्यवाद! वास्तव में मुझे उर्फ ​​.flush () की जरूरत है
MrNice


11

सबसे सरल:

अजगर ३

    print('\r' + 'something to be override', end='')

इसका मतलब है कि यह कर्सर को शुरुआत में वापस करेगा, इससे कुछ प्रिंट होगा और उसी लाइन में समाप्त होगा। यदि एक लूप में यह उसी स्थान पर प्रिंट करना शुरू कर देगा, जहां यह शुरू होता है।


3
ठंडा! विंडोज में भी काम करता है।
शीतल शाह

2
धन्यवाद यह मेरे लिए ठीक काम करता है! मुझे लगता है कि print(’something to be override’, end=‘\r’)यह सरल है, हालांकि।
ट्रोपिलियो


9

प्रिंट का एक वैकल्पिक endतर्क है, यह अंत में मुद्रित होता है। डिफ़ॉल्ट एक नई पंक्ति है, लेकिन आप इसे रिक्त स्ट्रिंग में बदल सकते हैं। जैसेprint("hello world!", end="")


2
यह अजगर 3 में है। अजगर 2 में आप बस कर सकते हैं print 'something',। अंत में अल्पविराम एक नई रेखा को जोड़ने से रोकता है।
अरजून

4

आप पिछले लाइन (बजाय लगातार यह करने के लिए जोड़ने) अधिलेखित करना चाहते हैं, तो आप को जोड़ सकते हैं \rसाथ print(),प्रिंट बयान के अंत में। उदाहरण के लिए,

from time import sleep

for i in xrange(0, 10):
    print("\r{0}".format(i)),
    sleep(.5)

print("...DONE!")

कंसोल में पुराने नंबर की जगह 0 से 9 को गिना जाएगा। "...DONE!"पिछले काउंटर, 9 के रूप में एक ही लाइन पर प्रिंट होगा।

ओपी के लिए आपके मामले में, यह कंसोल को "प्रगति बार" के रूप में इंस्टॉल का प्रतिशत पूरा प्रदर्शित करने की अनुमति देगा, जहां आप एक शुरुआत और अंत चरित्र की स्थिति को परिभाषित कर सकते हैं, और बीच में मार्कर को अपडेट कर सकते हैं।

print("Installing |XXXXXX              | 30%"),

4

यहां @ वादिम-ज़िन 4ुक द्वारा 3.0 संस्करण से प्राप्त 2.7-संगत संस्करण:

अजगर २

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print '{0}\r'.format(s),                # just print and flush

    time.sleep(0.2)

उस मामले के लिए, प्रदान किया गया 3.0 समाधान थोड़ा फूला हुआ दिखता है। उदाहरण के लिए, बैकस्पेस विधि पूर्णांक तर्क का उपयोग नहीं करती है और संभवतः पूरी तरह से दूर किया जा सकता है।

अजगर ३

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print('{0}\r'.format(s), end='')        # just print and flush

    time.sleep(0.2)                         # sleep for 200ms

दोनों का परीक्षण और काम किया गया है।


2

यह एक बहुत पुराना धागा है, लेकिन यहाँ एक बहुत ही गहन उत्तर और नमूना कोड है।

\rASCII वर्ण सेट से कैरिज रिटर्न का स्ट्रिंग प्रतिनिधित्व है । यह ऑक्टल 015[ chr(0o15)] या हेक्सिडेसिमल 0d[ chr(0x0d)] या दशमलव 13[ chr(13)] के समान है। man asciiएक उबाऊ पढ़ने के लिए देखें । यह ( \r) एक सुंदर पोर्टेबल प्रतिनिधित्व है और लोगों के पढ़ने के लिए काफी आसान है। इसका सीधा सा मतलब है कि कागज को आगे बढ़ाए बिना गाड़ी को सभी तरह से वापस स्टार्ट करने के लिए ले जाना। यह का CRहिस्सा है CRLFजिसका मतलब है कैरिज रिटर्न और लाइन फीड

print()Python 3 में एक फ़ंक्शन है। Python 2 में (कोई भी संस्करण जिसे आप उपयोग करने में रुचि रखते हैं), मॉड्यूल printसे इसकी परिभाषा आयात करके एक फ़ंक्शन में मजबूर किया जा सकता है __future__printफ़ंक्शन का लाभ यह है कि आप निर्दिष्ट कर सकते हैं कि आखिर में क्या प्रिंट किया जाए, \nहर के अंत में एक नई रेखा प्रिंट करने के लिए डिफ़ॉल्ट व्यवहार को ओवरराइड किया जाएprint() कॉल करें।

sys.stdout.flushपायथन को मानक आउटपुट के उत्पादन को फ्लश करने के लिए कहता है , जहां आप आउटपुट भेजते हैं print()जब तक कि आप अन्यथा निर्दिष्ट न करें। आप python -uपरिवेश चर के साथ चलाकर या सेट करके भी समान व्यवहार प्राप्त कर सकते हैं PYTHONUNBUFFERED=1, जिससे स्किपिंग हो सकती हैimport sys औरsys.stdout.flush() कॉल करना बंद हो जाएगा। वह राशि जो आप कर रहे हैं वह लगभग शून्य है और डिबग करना बहुत आसान नहीं है यदि आप आसानी से भूल जाते हैं कि आपके आवेदन के ठीक से व्यवहार करने से पहले आपको वह कदम उठाना होगा।

और एक नमूना। ध्यान दें कि यह पायथन 2 या 3 में पूरी तरह से चलता है।

from __future__ import print_function

import sys
import time

ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}

for i in range(1, ANS + 1):
    if i in FACTORS:
        print('\r{0:d}'.format(i), end='')
        sys.stdout.flush()
        time.sleep(ANS / 100.0)
else:
    print()

मुझे लगता है कि आपका उत्तर इसके लिए अधिक उपयुक्त है: stackoverflow.com/questions/45263205/…
मार्क केयुएला राफॉल्स

2

प्रिंट () में एक अंतर्निहित पैरामीटर "अंत" है जो डिफ़ॉल्ट रूप से "\ n" कॉलिंग प्रिंट ("यह अमेरिका है") के लिए है, वास्तव में प्रिंट ("यह अमेरिका है", अंत = "\ n") को कॉल कर रहा है। कॉल करने का एक आसान तरीका प्रिंट को कॉल करना है ("यह अमेरिका है", अंत = "")


1

यदि आपने किसी सरणी में मानों को पहले से संग्रहीत कर लिया है, तो आप उन्हें निम्न प्रारूप में कॉल कर सकते हैं:

for i in range(0,n):
       print arr[i],

1

पायथन प्रिंट करने के लिए एक अंत के रूप में नई पंक्ति को जोड़ता है। नई विधि के बजाय किसी स्थान को जोड़ने के लिए प्रिंट विधि के लिए python3 के लिए अंत = '' का उपयोग करें। python2 के लिए प्रिंट स्टेटमेंट के अंत में अल्पविराम का उपयोग करें।

print("Foo",end=' ')
print('Bar')

0

यह Quora पोस्ट मिली , इस उदाहरण के साथ जिसने मेरे लिए काम किया (python 3), जो कि मुझे इसकी आवश्यकता के करीब था (यानी पूरी पिछली पंक्ति को मिटा देना)।

उदाहरण वे प्रदान करते हैं:

def clock():
   while True:
       print(datetime.now().strftime("%H:%M:%S"), end="\r")

उसी लाइन पर छपाई के लिए, जैसा कि दूसरों ने सुझाव दिया है, बस उपयोग करें end=""


-2

मुझे यह समाधान मिला, और यह पायथन 2.7 पर काम कर रहा है

# Working on Python 2.7 Linux

import time
import sys


def backspace(n):
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(string)
    backspace(len(s))                       # back for n chars
    sys.stdout.flush()
    time.sleep(0.2)                         # sleep for 200ms

1
यह printपायथन 2.7 के लिए गलत सिंटैक्स है और कोड सही सिंटैक्स के साथ भी काम नहीं करता है।
कोरी मैडेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.