Создание хэшей MD5 для всех файлов в текущей папке, включая все файлы в подпапках - PullRequest
0 голосов
/ 31 марта 2020

с помощью этой темы

https://codereview.stackexchange.com/questions/147056/short-script-to-hash-files-in-a-directory

Мне удалось получить почти именно то, что мне нужно. Данный код

from os import listdir, getcwd
from os.path import isfile, join, normpath, basename
import hashlib


def get_files():
    current_path = normpath(getcwd())
    return [join(current_path, f) for f in listdir(current_path) if isfile(join(current_path, f))]


def get_hashes():
    files = get_files()
    list_of_hashes = []
    for each_file in files:
        hash_md5 = hashlib.md5()
        with open(each_file, "rb") as f:
            for chunk in iter(lambda: f.read(4096), b""):
                hash_md5.update(chunk)
        list_of_hashes.append('Filename: {}\tHash: {}\n'.format(basename(each_file), hash_md5.hexdigest()))
    return list_of_hashes


def write_hashes():
    hashes = get_hashes()
    with open('list_of_hashes.txt', 'w') as f:
        for md5_hash in hashes:
            f.write(md5_hash)


if __name__ == '__main__':
    write_hashes()

Однако, кроме того, я хотел бы рассмотреть все файлы, которые находятся в подпапках моего заданного пути, и включить их в вывод. Я пытался использовать os.walk (), но мне не удалось добиться успеха.

Можете ли вы помочь мне настроить функцию get_files () таким образом, чтобы она генерировала хеши MD5 для всех файлов в подпапках (т.е. учитывает всю структуру папок?)

Спасибо за любую помощь!

1 Ответ

1 голос
/ 31 марта 2020

Попробуйте это:

current_path = normpath(getcwd())
listOfFiles = []
for (dirpath, dirnames, filenames) in walk(current_path):
    listOfFiles += [join(dirpath, file) for file in filenames]

(на основе этот источник )

...