পূর্ববর্তী আউটপুট ওভাররাইট একই লাইনে আউটপুট?


103

আমি একটি এফটিপি ডাউনলোডার লিখছি। কোডের অংশটি হ'ল এইরকম:

ftp.retrbinary("RETR " + file_name, process)

কলব্যাকটি পরিচালনা করতে আমি ফাংশন প্রক্রিয়াটি কল করছি:

def process(data):
    print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!'
    file.write(data)

এবং আউটপুট এইরকম কিছু:

1784  KB / KB 1829 downloaded!
1788  KB / KB 1829 downloaded!
etc...   

তবে আমি এটি চাই যে এটি এই লাইনটি মুদ্রণ করবে এবং পরের বার এটি পুনরায় মুদ্রণ / রিফ্রেশ করবে যাতে এটি কেবল এটি একবার দেখায় এবং আমি সেই ডাউনলোডের অগ্রগতি দেখতে পাব।

এটা কিভাবে করা যাবে?



উত্তর:


200

পাইথন 3.x এর জন্য এখানে কোড:

print(os.path.getsize(file_name)/1024+'KB / '+size+' KB downloaded!', end='\r')

end=শব্দ এখানে কাজ করে কি - ডিফল্ট দ্বারা, print()একটি newline (ইন প্রান্ত \n) চরিত্র, কিন্তু এই একটি ভিন্ন স্ট্রিং সঙ্গে প্রতিস্থাপিত হতে পারে। এই ক্ষেত্রে, একটি ক্যারেজ রিটার্ন দিয়ে লাইন শেষ করে পরিবর্তে কার্সারটি বর্তমান লাইনের শুরুতে ফিরে আসে। সুতরাং, sysএই ধরণের সাধারণ ব্যবহারের জন্য মডিউলটি আমদানি করার দরকার নেই । print()আসলে বেশ কয়েকটি কীওয়ার্ড আর্গুমেন্ট রয়েছে যা কোডকে ব্যাপকভাবে সরল করতে ব্যবহার করা যেতে পারে।

পাইথন ২.6+ তে একই কোডটি ব্যবহার করতে, ফাইলের শীর্ষে নীচের লাইনটি রাখুন:

from __future__ import print_function

6
লক্ষ্য করুন মুদ্রণ ফাংশন ফাইল উপরের নিম্নলিখিত আমদানি যোগ করে 2.6+ পাইথন ব্যবহার করা যেতে পারে: from __future__ import print_function
জানিন

12
অজগর << 3.0 এ বিবৃতি শেষে একটি কমা একটি "\ n" রোধ করবে: print "foo",তবে পরিবর্তনটি দেখতে আপনার এখনও এর পরে ফ্লাশ করা দরকার:sys.stdout.flush()
টোবিয়াস দোহান

32
আমি খুঁজে পেলাম যে \rস্ট্রিংয়ের শুরুতে আমার অন্তর্ভুক্ত করা দরকার , এবং এটি কাজ করার জন্য end=''পরিবর্তে সেট করা দরকার। আমি মনে করি না যে শেষ হওয়ার সাথে সাথে আমার টার্মিনালটি এটি পছন্দ করেছে\r
জিজামন

4
সমস্ত বর্তমান পাইথন 3 রিলিজ, আপনি যোগ করতে পারেন flush=Trueথেকে print()নিশ্চিত করার বাফার রাঙা হয় (আদর্শ লাইন শুধুমাত্র বাফার যখন একটি ফ্লাশ হবে ফাংশন \nসম্পর্কে newline লেখা আছে)।
মার্টিজন পিটারস

4
একটি জুপিটার নোটবুকে, \rশুরুতে এটি ব্যবহার করে end=''সেরা এবং স্মুটেস্ট কাজ করে। ব্যবহার flush=Trueসঙ্গে \rশেষে যদি STRING এবং end='\r'আরো কাজ কিন্তু মসৃণ ছিল না & লাইন ও এর লাইনফীড মুছে ফেলা।
ডেভ এক্স

40

আপনি যা করতে চান তা হ'ল একক লাইন পরিবর্তন করা, ব্যবহার করুন \r\rমানে গাড়ীর ফেরত। এটি কেবলমাত্র বর্তমান লাইনের শুরুতে ক্যারেটটি ফিরিয়ে দেওয়া। এটি কিছুই মুছে না। একইভাবে, \bএকটি অক্ষর পিছনে যেতে ব্যবহার করা যেতে পারে। (কিছু টার্মিনাল সেই সমস্ত বৈশিষ্ট্যকে সমর্থন করে না)

import sys

def process(data):
    size_str = os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!'
    sys.stdout.write('%s\r' % size_str)
    sys.stdout.flush()
    file.write(data)

4
আমি \rবোঝাতে চাই যে গাড়ি চালা। এর প্রভাবটি কেবল বর্তমান লাইনের শুরুতে ক্যারেটটি ফিরিয়ে দেওয়া। এটি কিছুই মুছে না। একইভাবে, \bএকটি অক্ষর পিছনে যেতে ব্যবহার করা যেতে পারে। (কিছু টার্মিনাল সেই সমস্ত বৈশিষ্ট্য সমর্থন করে না)
অ্যাড্রিয়েন প্লিসন

sys.stdout.write('%s\r', size_str')আমি মনে করি আপনি বোঝাতে চেয়েছিলেন sys.stdout.write('%s\r' % size_str)কিন্তু এটি কাজ করে না।
ক্রিস্টিয়ান

@ অ্যাড্রিয়েন: শীতল, যোগ করেছেন। @ ক্রিশ্চিয়ান: ধন্যবাদ, আপডেট করেছেন যে, বেশ দেরি হয়ে গেছে।
স্যাম ডোলান

এছাড়াও মনে রাখবেন যে আপনি যদি পছন্দ করেন তবে তার printপরিবর্তে আপনি এখনও ব্যবহার করতে পারেন sys.stdout.write: ভাল print size_str + "\r",কাজ করে। ,মুদ্রণ বিবৃতি শেষে সম্পর্কে newline শুষে; sys.stdout.flush()এখনও প্রয়োজন
জেফ

19

কটাক্ষপাত আছে অভিশাপ মডিউল ডকুমেন্টেশন এবং অভিশাপ মডিউল হাওটুর

সত্যিকারের মৌলিক উদাহরণ:

import time
import curses

stdscr = curses.initscr()

stdscr.addstr(0, 0, "Hello")
stdscr.refresh()

time.sleep(1)

stdscr.addstr(0, 0, "World! (with curses)")
stdscr.refresh()

10
দুর্ভাগ্যক্রমে, অভিশাপগুলি কেবল ইউনিক্সে উপলব্ধ। ওপি আমাদের অ্যাপ্লিকেশনটি কোন অপারেটিং সিস্টেমটিকে টার্গেট করছে তা আমাদের
জানায়নি

আমি লিনাক্সের অধীনে কাজ করতে এতটাই অভ্যস্ত হয়েছি যে মডিউলটি কেবলমাত্র মডিউল ডক্সে ইউনিক্সের জন্য থাকার বিষয়ে সতর্কতাটি আমি খেয়ালও করে নি .. এটি নির্দেশ করার জন্য ধন্যবাদ, @ অ্যাড্রিয়েন।
আন্ড্রেয়া স্পাডাকাসিনি

4
@ অ্যাড্রিয়েনপ্লিসন, আমি জানি যে এই প্রশ্নটি বহু বছর আগে তৈরি হয়েছিল তবে, আপনি উইন্ডোজটিতে
কোল্ড

আমি যখন আমার পাইথন দোভাষীকে এটি আটকালাম তখন আমার টার্মিনালটি ফুবার হয়ে গেল। দোভাষী থেকে প্রস্থান করা কোনও উপকারে আসেনি। ডাব্লুটিএফ ?!
allyourcode

দ্বিতীয় লাইন প্রথমটির চেয়ে কম হলে ব্যবহার করুন clrtoeolfor
সার্জ স্ট্রোব্যা্যান্ড্ট

9

এখানে আমার ছোট্ট ক্লাসটি পাঠ্যের ব্লকগুলিকে পুনরায় মুদ্রণ করতে পারে। এটি পূর্ববর্তী পাঠ্যটি যথাযথভাবে সাফ করে দেয় যাতে আপনি কোনও জগাখিচুড়ি তৈরি না করেই আপনার পুরানো পাঠ্যকে আরও নতুন সংক্ষিপ্ত করে পাঠাতে পারেন।

import re, sys

class Reprinter:
    def __init__(self):
        self.text = ''

    def moveup(self, lines):
        for _ in range(lines):
            sys.stdout.write("\x1b[A")

    def reprint(self, text):
        # Clear previous text by overwritig non-spaces with spaces
        self.moveup(self.text.count("\n"))
        sys.stdout.write(re.sub(r"[^\s]", " ", self.text))

        # Print new text
        lines = min(self.text.count("\n"), text.count("\n"))
        self.moveup(lines)
        sys.stdout.write(text)
        self.text = text

reprinter = Reprinter()

reprinter.reprint("Foobar\nBazbar")
reprinter.reprint("Foo\nbar")

4
এই উইন্ডোজে না করবে না কাজ উইন্ডোজ 10 পর্যন্ত, কারণ উইন্ডোজ 10 প্রথম উইন্ডোজ ঐ কন্ট্রোল ক্যারেক্টার সমর্থন করার জন্য en.wikipedia.org/wiki/ANSI_escape_code
user136036

8

আমি খুঁজে পাই যে পাইথন ২.7-এ একটি সাধারণ মুদ্রণ বিবরণীর জন্য, আপনার পরে একটি কমা রেখেছি '\r'

print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!\r',

এটি অন্যান্য অ পাইথন 3 সমাধানের চেয়ে কম, তবে এটি বজায় রাখা আরও কঠিন।


4
পাইথন ২.7.১০, এবং এটি কিছুই মুদ্রণ করছে না। হতে পারে, আপনি এটি অনলাইন সংকলন করতে পারেন এবং এটি কীভাবে কাজ করছে তা দেখার জন্য আমাদের একটি লিঙ্ক পাঠাতে পারেন ...?
শোগো মাকিশিমা

5

আপনি কেবল স্ট্রিংয়ের শেষে '' r 'যুক্ত করতে পারেন এবং মুদ্রণ ফাংশনের শেষে একটি কমা। উদাহরণ স্বরূপ:

print(os.path.getsize(file_name)/1024+'KB / '+size+' KB downloaded!\r'),

4
এটি অজগর 3 এর জন্য? যদি তাই হয় তবে ডিফল্ট endপ্যারামিটারটি কী সেট করে \nতা প্রিন্ট করে (...)KB downloaded!\r\n। আমি কি ভূল?
এসআর

ব্যবহার end = '\r'পরিবর্তে পাইথন 3. সমস্যা সংশোধন করা হয়েছে
অভিমন্যু পল্লবী সুধীর

4

আমি স্পাইডার 3.3.1 ব্যবহার করছি - উইন্ডোজ 7 - অজগর 3.6 যদিও ফ্লাশের প্রয়োজন হতে পারে না not এই পোস্টিংয়ের উপর ভিত্তি করে - https://github.com/spyder-ide/spyder/issues/3437

   #works in spyder ipython console - \r at start of string , end=""
import time
import sys
    for i in range(20):
        time.sleep(0.5)
        print(f"\rnumber{i}",end="")
        sys.stdout.flush()

1

পূর্ববর্তী লাইনটি অজৈথুনে সমস্ত পাতায় ওভারডিট করার জন্য আপনার প্রিন্ট ফাংশনে end = '\ r' যুক্ত করতে হবে, উদাহরণটি পরীক্ষা করুন:

import time
for j in range(1,5):
   print('waiting : '+j, end='\r')
   time.sleep(1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.