Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何初始化progressbar并在递归调用时更新它_Python 2.7_Progress Bar - Fatal编程技术网

Python 2.7 如何初始化progressbar并在递归调用时更新它

Python 2.7 如何初始化progressbar并在递归调用时更新它,python-2.7,progress-bar,Python 2.7,Progress Bar,我试图建立一个功能,将发现一个文件夹中类似的文本文件,并将唯一的文件移动到一个单独的目录。该功能运行良好。我需要的是监控整个比较过程,因为这是一项耗时的任务。因此,我尝试合并“python progressbar”()。不幸的是,它崩溃并出现以下错误: File "C:\Users\anarchos78\Desktop\CompareForSimilarities\helpers.py", line 202, in compare for i in pbar(range(0, len

我试图建立一个功能,将发现一个文件夹中类似的文本文件,并将唯一的文件移动到一个单独的目录。该功能运行良好。我需要的是监控整个比较过程,因为这是一项耗时的任务。因此,我尝试合并“python progressbar”()。不幸的是,它崩溃并出现以下错误:

  File "C:\Users\anarchos78\Desktop\CompareForSimilarities\helpers.py", line 202, in compare
    for i in pbar(range(0, len(list))):
  File "C:\Users\anarchos78\Desktop\CompareForSimilarities\scripts\progressbar\__init__.py", line 181, in __next__
    else: self.update(self.currval + 1)
  File "C:\Users\anarchos78\Desktop\CompareForSimilarities\scripts\progressbar\__init__.py", line 271, in update
    raise ValueError('Value out of range')
ValueError: Value out of range
我认为当我递归调用函数(见下面最后一行)时会出现问题,progressbar无法更新。比较功能:

import progressbar

# Set up the progressbar
widgets = [progressbar.Percentage(), ' ', progressbar.Bar(), ' ', progressbar.ETA(), ' ']
pbar = progressbar.ProgressBar(widgets=widgets)

# Compare function
def compare(fileToWrite, list, sourcePath, singlesPath, groupsPath):
    if len(list) > 1:
        file1 = list[0]
        file1Path = os.path.join(sourcePath, file1)
        txt1 = open(file1Path)

        # Remove file not to examine for similarities with itself
        list.remove(file1)

        sameItems = {}
        sameItems.update({file1: fileLength(file1Path)})

        for i in pbar(range(0, len(list))):
            file2Path = os.path.join(sourcePath, list[i])
            txt2 = open(file2Path)
            examine = difflib.SequenceMatcher(None, txt1.read(), txt2.read())
            ratio = formatRatio(examine.ratio())
            if ratio > 80:
                sameItems.update({list[i]: fileLength(file2Path)})

            largestFile = keyWithMaxValue(sameItems)
            copyUnique(sourcePath, largestFile, singlesPath)

            fileToWrite.write(file1 + ' <=> ' + list[i] + ' ' + str(ratio) + ' ' +
                               '%' + '. The stuct: ' + str(sameItems) + '\n')
            txt2.close()
        txt1.close()

        # Renew the list by removing the duplicates to pass it to our recursive call
        # [the purpose for this is not to do unnecessary file comparisons]
        for key in sameItems.keys():
            if key in list:
                list.remove(key)

        fileToWrite.write('\n')

        # Pass the renewed list to our recursive call
        compare(fileToWrite, list, sourcePath, singlesPath, groupsPath)
导入进度条
#设置progressbar
widgets=[progressbar.Percentage(),'',progressbar.Bar(),'',progressbar.ETA(),'']
pbar=progressbar.progressbar(widgets=widgets)
#比较函数
def比较(fileToWrite、list、sourcePath、singlesPath、groupsPath):
如果len(列表)>1:
file1=列表[0]
file1Path=os.path.join(sourcePath,file1)
txt1=打开(file1Path)
#删除文件,不检查与自身的相似性
列表。删除(文件1)
sameItems={}
update({file1:fileLength(file1Path)})
对于pbar中的i(范围(0,len(列表)):
file2Path=os.path.join(源路径,列表[i])
txt2=打开(file2Path)
examine=difflib.SequenceMatcher(无,txt1.read(),txt2.read())
比率=格式比率(检查.ratio())
如果比率>80:
update({list[i]:fileLength(file2Path)})
largestFile=keyWithMaxValue(相同项)
copyUnique(源路径、最大文件、单一路径)
fileToWrite.write(file1++'+list[i]++'+str(ratio)+''+
“%'+”。结构:“+str(sameItems)+'\n')
txt2.close()
txt1.close()
#通过删除重复项来更新列表,并将其传递给递归调用
#[目的不是进行不必要的文件比较]
对于sameItems.keys()中的键:
如果输入列表:
列表。删除(键)
fileToWrite.write(“\n”)
#将更新的列表传递给我们的递归调用
比较(fileToWrite、list、sourcePath、singlesPath、groupsPath)
有没有办法将progressbar合并到递归函数中


任何建议都将不胜感激。

progressbar希望知道它将获得的最大值。第一次调用
pbar(范围(0,len(列表))
时,设置maxval。下次调用时,
progressbar
将变得混乱,并引发
ValueError
异常

让progressbar不知道它将获得多少更新(即:maxval)是可以的,但是如果它认为它知道,那么如果它获得不同的maxval,它就会感到困惑

创建一个号码,在循环中每次添加一个号码,然后将该号码传递给每个呼叫。使用数字告诉
progressbar
更新自身:

for i in range(1000000):
  # do something
  pbar.update(10*i+1)   # progressbar doesn't know the max, but works with larger numbers

另请参见:

但是当我递归调用函数时会发生什么(请参见比较函数的最后一行)。我认为progressbar试图更新。我说的对吗?对。Progressbar想知道它的大小。第一次调用
pbar
时,使用固定大小的迭代器调用它,因此
pbar
设置
pbar.maxval=len(list)
。下次调用pbar时,将使用不同的长度调用它,因此库会变得混乱,并引发
ValueError
是的,我知道了。但是,我应该在哪里使用第一次提交的值(最大值)初始化progressbar,然后在递归调用后使用更新的最大值初始化progressbar。这里是我缺少的一些内容。如果您知道max len,请将其放入
ProgressBar(maxlen=123)
init调用中。如果没有,请创建一个全局号码,递增它,并将其发送到
pbar.update(num)
调用中。