индикатор выполнения для чтения строк в текстовом файле - PullRequest
3 голосов
/ 14 февраля 2012

Я читаю форму строк в текстовом файле, а затем выполняю действия для каждой строки. Из-за размера текстового файла и времени каждого действия 500 => секунд. Я хотел бы видеть прогресс, но не уверен, с чего начать.

Вот пример сценария, который я использую, как бы написать это для этого?

import os

tmp = "test.txt"
f = open(tmp,'r')

for i in f:
    ip = i.strip()
    os.system("ping " + ip + " -n 500")

f.close()

test.txt:

10.1.1.1
10.1.1.2
10.2.1.1
10.2.1.1

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Вот удобный модуль: progress_bar.

Это коротко и достаточно просто;Прочитайте источник идей для реализации своего собственного.

Вот очень простой фрагмент кода, который, я надеюсь, прояснит ситуацию:

import time, sys

# The print statement effectively treats '\r' as a newline, 
# so use sys.stdout.write() and .flush() instead ...
def carriage_return_a():
    sys.stdout.write('\r')
    sys.stdout.flush()

# ... or send a terminal control code to non-windows systems
# (this is what the `progress_bar` module does)
def carriage_return_b():
    if sys.platform.lower().startswith('win'):
        print '\r'
    else:
        print chr(27) + '[A'

bar_len = 10
for i in range(bar_len + 1):
    # Generate a fixed-length string of '*' and ' ' characters
    bar = ''.join(['*'] * i + [' '] * (bar_len - i))

    # Insert the above string and the current value of i into a format
    # string and print, suppressing the newline with a comma at the end
    print '[{0}] {1}'.format(bar, i),

    # Write a carriage return, sending the cursor back to the beginning
    # of the line without moving to a new line. 
    carriage_return_a()

    # Sleep
    time.sleep(1)

Как уже заметили другие, вам все еще нужнознать общее количество строк в файле, чтобы иметь очень значимый индикатор выполнения.Самый простой способ сделать это - прочитать весь файл, чтобы получить количество строк;но это довольно расточительно.

Включение этого в простой класс не так уж сложно ... теперь вы можете создать индикатор выполнения и update() каждый раз, когда изменяется значение интереса.

class SimpleProgressBar(object):
    def __init__(self, maximum, state=0):
        self.max = maximum
        self.state = state

    def _carriage_return(self):
        sys.stdout.write('\r')
        sys.stdout.flush()

    def _display(self):
        stars = ''.join(['*'] * self.state + [' '] * (self.max - self.state))
        print '[{0}] {1}/{2}'.format(stars, self.state, self.max),
        self._carriage_return()

    def update(self, value=None):
        if not value is None:
            self.state = value
        self._display()

spb = SimpleProgressBar(10)
for i in range(0, 11):
    time.sleep(.3)
    spb.update(i)
1 голос
/ 14 февраля 2012

Другой отправной точкой может быть модуль progressbar.

Вы также можете скачать исходный код [здесь] , внутри tar.gz естьexample.py файл с хорошими примерами.

...