Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 22.01.2014
Сообщений: 5

Сравнить и заменить значение MD5 суммы в файле

22.01.2014, 12:09. Показов 5986. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Только начал изучать python и пока не понимаю как выполнить задачу:
Есть файл со списком путей к файлам и суммой MD5. Необходимо провести сравнение по тому же каталогу и где файл поменял свой размер заменить MD5 на новую.

С вычислением и записью пути и MD5 суммы разобрался
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import os
import hashlib
 
m = hashlib.md5()
 
def MD5Hash(filename):
    with open(filename, 'rb') as fd:
        b = fd.read()
        m.update(b)
    return m.hexdigest()
 
rootpath = ' '
 
with open(rootpath+"/checksums.txt", 'w') as log:
    for dirname, dirnames, filenames in os.walk(rootpath):
        for filename in filenames:
            fname = os.path.join(dirname, filename)
            #print fname
            hv = MD5Hash(fname)
            if fname.find(".git")==-1 and fname.find(".DS_Store")==-1:
                    log.write("%s %s\n" % (os.path.relpath( fname, rootpath ), hv) )
А вот как сюда добавить сравнение и замену суммы - пока не понимаю
Пробовал разбить строку на 2 значения, но что делать дальше?
Python
1
fname_parsed = dict(map(string.split, open(fname, 'r').readlines()))
Буду очень благодарен за помощь, или хотя бы за верное направление.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2014, 12:09
Ответы с готовыми решениями:

Сравнить значение md5 с другим
Всем привет.Нужно вычислить сумму md5 из одного файла и поместить эту сумму в textbox,после этого сравнить значение со значением из файла с...

Вычислить приближенно значение бесконечной суммы (справа от каждой суммы дается ее точное значение, с которым можно сравнить полученный ответ)
нужно срочно плиз! "ПАСКАЛЬ"

Вычислить приближенно значение бесконечной суммы (справа от каждой суммы дается ее точное значение, с которым можно сравнить полученный ответ):
1+x^1 /1!+x^2 /2!+x^3 /3!+...=e^x

8
45 / 39 / 24
Регистрация: 29.11.2013
Сообщений: 145
22.01.2014, 16:14
Примерно так:
Python
1
2
3
4
5
6
7
8
9
# -*- coding: utf-8 -*-
 
d = 'A=1 B=2 C=3 D=4'
s = [x.split('=') for x in d.split(' ')]
x = ['D', '4']
 
for f in range(0, len(s)):
    if x[0] and x[1] in s[f]:
        print(s[f])
Т.е. запись формата A=1 где А это имя файла, а 1 это хэш. При не совпадении замена s[f] на реальную.
1
Z3JheSBoYXQ=
 Аватар для fanatdebian
342 / 237 / 83
Регистрация: 08.07.2012
Сообщений: 577
22.01.2014, 17:29
Дай кусок файла со списком диров и хешами. Отсюда и плясать начнем.
0
0 / 0 / 0
Регистрация: 22.01.2014
Сообщений: 5
22.01.2014, 17:50  [ТС]
Файл выглядит надопобие этого, разделял пробелами (хотя мог как угодно)
Кликните здесь для просмотра всего текста
checksums.txt 6dc31db74ed86b4aa0005c198f52bde4
FirstProject/FirstProject-Info.plist 3e8e1ba5354270f47588de5cb1a800ca
FirstProject/FirstProject-Prefix.pch 330a8b3f37d543178eec875819fb9812
FirstProject/Ipad_testAppDelegate.h d1a9f71eec661cb4cebc77f721a1893c
FirstProject/Ipad_testAppDelegate.m b7aa7bf54a0a3d31315b143e9933a741
FirstProject/Ipad_testViewController.h e933686a08631befb8e780c36cb44e3f
FirstProject/Ipad_testViewController.m 2c2faa436092a50137985c87fc0d0d70
FirstProject/main.m f3921017b96912a4a3c89a337e77a1b3
FirstProject/Base.lproj/Main.storyboard 2e6fd67b55dd862d8383a39c4e1a76e7
FirstProject/en.lproj/InfoPlist.strings cf6aacfcd0af11d90bcc9ed210e50a77
FirstProject/Images.xcassets/AppIcon.appiconset/Contents.json df3f4a5a772cc72c5cb52dfe84a6b413
FirstProject/Images.xcassets/LaunchImage.launchimage/Contents.json f9d4cabc00fe3f5c048ab03e43ba1231
FirstProject.xcodeproj/project.pbxproj a7ca289d22b703648f45b82cb432a066
FirstProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata 7103bb2fe36e8939b98184676b4a028c
FirstProject.xcodeproj/project.xcworkspace/xcuserdata/dmitry.bubenko.xcuserdatad/UserInterfaceState.xcuserstate e0d136f65ddf2791383b4adb310989f8
FirstProject.xcodeproj/project.xcworkspace/xcuserdata/dmitry.bubenko.xcuserdatad/WorkspaceSettings.xcsettings cac372a919c5137dbbf4944b1fa4b497
FirstProject.xcodeproj/xcuserdata/dmitry.bubenko.xcuserdatad/xcschemes/FirstProject.xcscheme 1919e6a27c3a85b0d7cf145e137094b2
FirstProject.xcodeproj/xcuserdata/dmitry.bubenko.xcuserdatad/xcschemes/xcschememanagement.plist 1c9fdb52c406474244592c4961f28d02
FirstProjectTests/FirstProjectTests-Info.plist 6027737a8253c7dbdb993b9a5b4aba1c
FirstProjectTests/FirstProjectTests.m 5be4936acb833c97d1e287e80ce35b70
FirstProjectTests/en.lproj/InfoPlist.strings ed151d147f944e89802ebf52bfe87f75

При чтении файла получается массив типа list, с ним ничего не смог придумать, кроме как преобразовать в словарь
0
Z3JheSBoYXQ=
 Аватар для fanatdebian
342 / 237 / 83
Регистрация: 08.07.2012
Сообщений: 577
22.01.2014, 18:48
Python
1
2
3
4
5
6
7
8
def update_hash_path(infile):
  book= {x.split()[0]: x.split()[1] for x in open(infile) if x}
  for key in book:
    print '{:<120}{:<35}'.format(key, book[key])
    current_hash = md5(open(key).read()).hexdigest()
    if book[key] not in current_hash:
      print 'Need update ==>', key
      book[key] = current_hash
Добавлено через 4 минуты
исходил из представленной вырезки файла. Как видно, там всегда первое значение строки имя к файловому объекту с путем, второе значение собственно хэш данных сего объекта на момент создания этого файла.

Функция чекает на соответствие, если его нет, меняет в книге но не в файле, допили как нужно.

Добавлено через 16 минут
Python
1
2
3
4
5
6
7
8
def update_hash_path(infile):
  book= {x.split()[0]: x.split()[1] for x in open(infile) if x}
  for key in book:
    current_hash = md5(open(key).read()).hexdigest()
    if book[key] not in current_hash:
      book[key] = current_hash
  with open(infile,'w') as outf:
    outf.writelines(''.join([''.join(key+' '+book[key]+'\n') for key in book]))
2
0 / 0 / 0
Регистрация: 22.01.2014
Сообщений: 5
24.01.2014, 11:41  [ТС]
Получилось приблизительно вот такое, только непонятно почему каждый раз при тех же файлах сумма MD5 новая
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!bin/python
import os
import hashlib
 
m = hashlib.md5()
 
def MD5Hash(filename):
    with open(filename, 'rb') as fd:
        b = fd.read()
        m.update(b)
    return m.hexdigest()
 
rootpath = 'Путь_к_проекту'
 
with open(rootpath+"/checksums.txt", 'r') as log:
    book= {x.split()[0]: x.split()[1] for x in log if x}
    print book
    for key in book:
        for dirname, dirnames, filenames in os.walk(rootpath):
            for filename in filenames:
                fname = os.path.join(dirname, filename)
                #print fname
                hv = hashlib.md5(open(key).read()).hexdigest()
                if fname.find("*//.git")==-1 and fname.find("*//.DS_Store")==-1:
                    if book[key] not in hv:
                        book[key] = hv
                    with open(rootpath+"/checksums.txt",'w') as outf:
                        outf.writelines(''.join([''.join(key+' '+book[key]+'\n') for key in book]))
                        #outf.writelines("%s %s\n" % (os.path.relpath( fname, rootpath ), hv) )
Добавлено через 1 час 12 минут
Все, разобрался итоговый результат выше
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
25.01.2014, 09:43
Цитата Сообщение от Дмитрий_Б Посмотреть сообщение
Все, разобрался итоговый результат выше
Ужасно.
Для каждой записи в файле контрольных сумм Вы перебираете весь каталог - какой в этом смысл.
Вы переписываете файл контрольных сумм при каждом изменении, вместо того чтобы выполнить запись один раз при полном завершении проверки.
Ну и Вас не смущает тот факт, что у Вас может происходить перезапись файла, открытого на чтение?

Вот вариант того, что Вы хотели получить:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import fnmatch
import hashlib
import os
import re
from collections import OrderedDict
from itertools import filterfalse
 
HASH_NAME = "checksum.txt"
 
def md5(fname):
    result = hashlib.md5()
    with open(fname, "rb") as f:
        while True:
            d = f.read(8192)
            if not d:
                break
            result.update(d)
    return result.hexdigest()
 
 
def locatefalse(pattern="", root=os.curdir):
    join = os.path.join
    root = os.path.abspath(root)
 
    pattern = "{};{}".format(pattern, HASH_NAME) if pattern else HASH_NAME
    pattern = pattern.split(";")
    pattern = re.compile("|".join(map(fnmatch.translate, pattern)), re.I).match
 
    for path, dirs, files in os.walk(root):
        for filename in filterfalse(pattern, files):
            yield join(path, filename)
 
 
def update_hash(pattern, root):
    chkname = os.path.join(root, HASH_NAME)
    if os.path.exists(chkname):
        with open(chkname, "rt", encoding="utf-8") as f:
            book = OrderedDict(x.split() for x in f if x)
    else:
        book = OrderedDict()
 
    relpath = os.path.relpath
 
    files = set()
 
    for name in locatefalse(pattern, root):
        key = relpath(name, root)
        _hash = md5(name)
        if key in book:
            if _hash != book[key]:
                print("update checksum for {}".format(key))
                book[key] = _hash
        else:
            print("add checksum for {}".format(key))
            book[key] = _hash
        files.add(key)
 
    for key in set(book) - files:
        print("delete checksum for {}".format(key))
        del book[key]
 
    with open(chkname, "wt", encoding="utf-8") as f:
        all(map(f.write, ("{} {}\n".format(k, v) for k, v in book.items())))
 
 
if "__main__" == __name__:
    update_hash("*.git;*.ds_store", "Путь_к_проекту")
1
0 / 0 / 0
Регистрация: 22.01.2014
Сообщений: 5
05.02.2014, 13:03  [ТС]
Цитата Сообщение от pyuser Посмотреть сообщение
Вот вариант того, что Вы хотели получить:
В вашем варианте ошибка при повторном вызове, если проверяется больше 7 файлов (ValueError: too many values to unpack)

Немного модицифировал и по итогу получился такой вариант (может кому-нибудь пригодится):
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import hashlib
import os
 
HASH_NAME = "checksum.txt"
 
def md5(filename):
    result = hashlib.md5()
    with open(filename, "rb") as fn:
        while True:
            d = fn.read(8192)
            if not d:
                break
            result.update(d)
    return result.hexdigest()
 
def update_hash(root):
    chkname = os.path.join(root, HASH_NAME)
    if os.path.exists(chkname):
            with open(chkname, "rt") as logs:
                book = {x.split()[0]: x.split()[1] for x in logs if x}
    else:
        book = {}
    for dirname, dirnames, filenames in os.walk(root):
        for filename in filenames:
            fname = os.path.join(dirname, filename)
            _hash = md5(fname)
            if fname.find(".git")==-1 and fname.find(".DS_Store")==-1:
                if fname in book:
                    if _hash != book[fname]:
                        print("update checksum for {}".format(fname))
                        book[fname] = _hash
                else:
                    print("add checksum for {}".format(fname))
                    book[fname] = _hash
    with open(chkname, "wt") as fw:
        all(map(fw.write, ("{} {}\n".format(k, v) for k, v in book.items())))
 
if "__main__" == __name__:
    update_hash("начальный_каталог")
0
0 / 0 / 0
Регистрация: 19.09.2009
Сообщений: 57
14.11.2014, 13:02
Добрый день, Дмитрий_Б,

Не могли бы вы рассказать как заполняете файл checksum.txt ?
Как получаете список файлов и их md5?

Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2014, 13:02
Помогаю со студенческими работами здесь

Вычислить приближенно значение бесконечной суммы (справа от каждой суммы дается ее точное значение, с которым можно сравнить полученный ответ)

Вычислить приближенно значение бесконечной суммы (справа от каждой суммы дается ее точное значение, с которым можно сравнить полученный ответ)
1+(1\2^2)+(1\3^2)+(1\4^2)+...=p^2\6

В файле из вещественных чисел заменить значение k-го компонента средним значением суммы положительных компонентов файла.
помогите пожалуйста.......!!!!! В файле из вещественных чисел заменить значение k-го компонента средним значением суммы положительных...

Вычислить значение суммы ряда S. Сравнить полученное значение с точным решением Y
Вычислить значение суммы ряда S. Сравнить полученное значение с точным решением Y, вычислив абсолютную и относительную погрешности. ...

Как сравнить значение со значением в файле?
Как сравнить значение со значением в файле? Например: сохранил в файле значения 1234 и abcd, затем ввожу с консоли число 1234. Теперь мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru