Уведомления

Группа в Telegram: @pythonsu

#1 Июль 29, 2016 15:28:13

zikfriddi
Зарегистрирован: 2016-07-29
Сообщения: 28
Репутация: +  0  -
Профиль   Адрес электронной почты  

Проблема с прогресс баром

Доброго всем дня!
Помогите разобраться с вот этим кодом

 mport os, sys, shutil
def copytree(src, dst):
    
    for file in os.listdir(src):
        pathSrc = os.path.join(src,file)
        pathDst = os.path.join(dst,file)
        if os.path.isdir(pathSrc):
            if not os.path.exists(pathDst):
                os.mkdir(pathDst)
            copytree(pathSrc, pathDst,)
        else:
            shutil.copy2(pathSrc, pathDst)
            printProgress(i, l, prefix = 'Progress:', suffix = 'Complete', barLength = 50)
            i+=1
            
def printProgress (iteration, total, prefix = '', suffix = '', decimals = 2, barLength = 100):
    filledLength    = int(round(barLength * iteration / float(total)))
    percents        = round(100.00 * (iteration / float(total)), decimals)
    bar             = '█' * filledLength + '-' * (barLength - filledLength)
    sys.stdout.write('\r%s |%s| %s%s %s' % (prefix, bar, percents, '%', suffix)),
    sys.stdout.flush()
    if iteration == total:
        sys.stdout.write('\n')
        sys.stdout.flush()
items = list(range(0, 100))
l = len(items)
i = 0
src = 'E:\\temp\\SampleHTML'
dst = 'E:\\temp\\TestMkDir'
copytree(src,dst)
Выводит ошибку:
 C:\Users\>python E:\temp\test.py
Traceback (most recent call last):
  File "E:\temp\test.py", line 42, in <module>
    copytree(src,dst)
  File "E:\temp\test.py", line 4, in copytree
    print(i)
UnboundLocalError: local variable 'i' referenced before assignment

Почему так происходит?

Офлайн

#2 Июль 30, 2016 18:33:18

frakite
Зарегистрирован: 2015-12-10
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с прогресс баром

В функции copytree вы пишете
printProgress(i, l, prefix = ‘Progress:’, suffix = ‘Complete’, barLength = 50)

хотя до этого в функции i никак не задана

Офлайн

#3 Июль 30, 2016 18:57:27

zikfriddi
Зарегистрирован: 2016-07-29
Сообщения: 28
Репутация: +  0  -
Профиль   Адрес электронной почты  

Проблема с прогресс баром

Так i задана до вызова copytree, i = 0. Как глобальная переменная.

Отредактировано zikfriddi (Июль 30, 2016 18:57:41)

Офлайн

#4 Июль 31, 2016 02:10:50

kampella
Зарегистрирован: 2014-11-21
Сообщения: 95
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблема с прогресс баром

вы не можете переопределить внешнюю переменную
i+=1
подразумевает существование i в локальной области

Офлайн

#5 Июль 31, 2016 05:34:27

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Проблема с прогресс баром

kampella
вы не можете переопределить внешнюю переменную
1.
 def f():
    global i
    i+=1
i=3
f()
print(i)
2.
Имя copytree уже занято https://docs.python.org/2/library/shutil.html.
3.
Такое использование глобальной переменной плохой стиль. У вас оно совершенно непонятно зачем используется.
 def f():
    i=0
    while 1:
        print(i)
        i+=1

Это похоже на огород. print достаточен.
    sys.stdout.write('\r%s |%s| %s%s %s' % (prefix, bar, percents, '%', suffix)),
    sys.stdout.flush()
    if iteration == total:
        sys.stdout.write('\n')
        sys.stdout.flush()

 from __future__ import print_function
print('.', end="", flush=True)



Отредактировано doza_and (Июль 31, 2016 05:56:36)

Офлайн

#6 Июль 31, 2016 11:33:03

zikfriddi
Зарегистрирован: 2016-07-29
Сообщения: 28
Репутация: +  0  -
Профиль   Адрес электронной почты  

Проблема с прогресс баром

Спасибо за ответ.

По поводу имени функции, недодумал, исправлю.
Что касается i , как её объявить внутри рекурсивной функции? Или как по другому реализовать прогресс бар?

Офлайн

#7 Июль 31, 2016 12:19:15

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Проблема с прогресс баром

> Что касается i , как её объявить внутри рекурсивной функции?

Передавать как параметр:

 def copytree(src, dst, i=0):
    ...
    copytree(pathSrc, pathDst, i)
    ...



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#8 Июль 31, 2016 15:00:18

zikfriddi
Зарегистрирован: 2016-07-29
Сообщения: 28
Репутация: +  0  -
Профиль   Адрес электронной почты  

Проблема с прогресс баром

Я так пробовал, в конце почему-то I у меня равно 0.

Офлайн

#9 Июль 31, 2016 17:06:04

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Проблема с прогресс баром

 #!/usr/bin/python
# coding: utf-8
import os, sys, shutil
def copytree(src, dst):
    i = 0
    for fail in os.listdir(src):
        pathSrc = os.path.join(src, fail)
        pathDst = os.path.join(dst, fail)
        if os.path.isdir(pathSrc):
            if not os.path.exists(pathDst):
                os.mkdir(pathDst)
            copytree(pathSrc, pathDst)
        else:
	    i += 1
            shutil.copy2(pathSrc, pathDst)
            total = len([ name for name in os.listdir(src) if os.path.isfile(pathSrc) ])
            printProgress(i, total, prefix='Progress:', suffix='Complete')
            
def printProgress(iteration, total, prefix='', suffix='', decimals=2, barLength=100):
    percents = round(float(iteration)/total, decimals)*barLength
    bar = u'█' * int(percents) + '-' * (barLength-int(percents))
    sys.stdout.write('\r%s |%s| %s%s %s' % (prefix, bar, percents/barLength*100, '%', suffix))
    sys.stdout.flush()
    if iteration == total:
        print('\n')
 
src = '/home/rodegast/0/0'
dst = '/home/rodegast/0/1'
copytree(src, dst)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июль 31, 2016 17:12:32)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version