Python:当for循环多次完成时,如何打印语句?

时间:2012-11-27 13:47:12

标签: python

我有一些代码主要围绕以下两行进行回顾:

#! /usr/bin/env python

from crypt import crypt
import itertools
from string import ascii_letters, digits

def decrypt(all_hashes, salt, charset=ascii_letters + digits + '-' + '/'):
    products = (itertools.product(charset, repeat=r) for r in range(10))
    chain = itertools.chain.from_iterable(products)
    for i, candidate in enumerate(chain, 1):
        if i % 100 == 0:
            print ('%d th candidate: %s' % (i, candidate))
        hash = crypt(''.join(candidate), salt)
        if hash in all_hashes:

            yield candidate, hash
            all_hashes.remove(hash)

        if not all_hashes:
            return

all_hashes = ('aaRrt6qwqR7xk', 'aaacT.VSMxhms' , 'aaWIa93yJI9kU',
'aakf8kFpfzD5E', 'aaMOPiDnXYTPE', 'aaz71s8a0SSbU', 'aa6SXFxZJrI7E',
'aa9hi/efJu5P.', 'aaBWpr07X4LDE', 'aaqwyFUsGMNrQ', 'aa.lUgfbPGANY',
'aaHgyDUxJGPl6', 'aaTuBoxlxtjeg', 'aaluQSsvEIrDs', 'aajuaeRAx9C9g',
'aat0FraNnWA4g', 'aaya6nAGIGcYo', 'aaya6nAGIGcYo', 'aawmOHEectP/g',
'aazpGZ/jXGDhw', 'aadc1hd1Uxlz.', 'aabx55R4tiWwQ', 'aaOhLry1KgN3.',
'aaGO0MNkEn0JA', 'aaGxcBxfr5rgM', 'aa2voaxqfsKQA', 'aahdDVXRTugPc',
'aaaLf47tEydKM', 'aawZuilJMRO.w', 'aayxG5tSZJJHc', 'aaPXxZDcwBKgo',
'aaZroUk7y0Nao', 'aaZo046pM1vmY', 'aa5Be/kKhzh.o', 'aa0lJMaclo592',
'aaY5SpAiLEJj6', 'aa..CW12pQtCE', 'aamVYXdd9MlOI', 'aajCM.48K40M.',
'aa1iXl.B1Zjb2', 'aapG.//419wZU')

all_hashes = set(all_hashes)
salt = 'aa'
for candidate, hash in decrypt(all_hashes, salt):
    print 'Found', hash, '! The original string was', candidate

该程序基本上是一个暴力攻击,因为输出可能需要一段时间,我需要知道程序是否仍在运行或已经崩溃,所以我想有一个输出语句,说明已经有多少个字符组合尝试过,也许最后一次尝试的字符串是什么,但不知道该怎么做。

提前感谢您的帮助

3 个答案:

答案 0 :(得分:9)

使用enumerate来计算候选人数。

for i, candidate in enumerate(chain, 1):
    if i % 100 == 0:
        print("%d'th candidate: %s" % (i, candidate))
    # perform actual work

答案 1 :(得分:1)

PRINT_COUNT = 10
chain = itertools.chain.from_iterable(products)
count = 0
for candidate in chain:
  hash = crypt(''.join(candidate), salt)
  count = count + 1
  if count % PRINT_COUNT == 0:
    print "count = " + str(count)

答案 2 :(得分:0)

好的,我们先来看另一个例子:

import time
import sys

for i in range(30):
    sys.stdout.write('\r%d'%i)
    sys.stdout.flush()
    time.sleep(0.1)

运行它,它将打印i。

的运行时值

注意'\ r'

因此,您可以在代码中执行以下操作:

chain = itertools.chain.from_iterable(products)
i = 0
for candidate in chain:
    sys.stdout.write('\r%d'%i)
    sys.stdout.flush()
    i += 1
    hash = crypt(''.join(candidate), salt)

如果输出值增加,则表示程序正在运行。 甚至您可以添加所有者代码以确定剩余时间。