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

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

22.01.2014, 12:09. Показов 6027. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru