Проверьте, существует ли значение MD5 в файле индекса - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь найти способ проверить, может ли мой код перепроверить существование значения преобразования md5 строки URL в индексном файле, и если да, пропустить сканирование.

Ниже приведен мой код

Сформированный URL-адрес преобразован в строку md5 и затем сохранен в файле idx после завершения сканирования, цель -будущие сканы не должны получать тот же URL.Проблема, которую я вижу, заключается в том, что if str(md5url) in line не выполняется, возможно, потому, что я не использую '\ n' в качестве суффикса при добавлении хеша в файл.Но я попробовал, чтобы он все еще не работал.

Есть идеи?

def computeMD5hash(string_for_hash):
    m = hashlib.md5()
    m.update(string_for_hash.encode('utf-8'))
    return m.hexdigest()


def writefilehash(formation_URL):
    fn="urlindex.idx"
    try:
        afile = open(fn, 'a')
        afile.write(computeMD5hash(formation_URL))
        afile.close()
    except IOError:
        print("Error writing to the index file")

fn="urlindex.idx"
try:
    afile = open(fn, 'r')
except IOError:
    afile = open(fn, 'w')

for f in files:
    formation=repouri + "/" + f
    #print(computeMD5hash(formation))
    md5url=computeMD5hash(formation)
    hashlist = afile.readlines()
    for line in hashlist:
        if str(md5url) in line:
            print ("Skipping " + formation + " because its already scanned and indexed as  " + line)
        else:
            if downloadengine(formation):
                print ("Download completed " + formation)
                print ("Starting to write to database..")
                #writetodatabase()
                print ("Writing hash value ..")
                writefilehash(formation)

print("Closing..")
afile.close()

1 Ответ

0 голосов
/ 26 ноября 2018

Вы тестируете в цикле .Для каждой строки, которая не совпадает, вы загружаете:

line1
    if hash in line:
        print something
    else
        download
line2
    if hash in line:
        print something
    else
        download
line3
    if hash in line:
        print something
    else
        download

Если хэш находится в строке 1, то вы все равно скачиваете, потому что хэш находится не в строке 2 или строке 3. Вы не должны принимать решениезагружать до тех пор, пока вы не протестируете все строки .

Лучший способ сделать это - прочитать все хеши за один раз в наборе объекта (потому что тестирование на предмет соответствия для набора быстрее).Удалите разделители строк:

try:
    with open(fn) as hashfile:
        hashes = {line.strip() for line in hashfile}
except IOError:
    # no file yet, just use an empty set
    hashes = set()

, затем при тестировании новых хэшей используйте:

urlhash = computeMD5hash(formation)
if urlhash not in hashes:
    # not seen before, download
    # record the hash
    hashes.add(urlhash)
    with open(fn, 'a') as hashfile:
        hashfile.write(urlhash + '\n')
...