Получить «среднее» из нескольких случайно разбитых копий одного и того же файла - PullRequest
0 голосов
/ 29 мая 2018

Из-за неработающего контроллера файлы случайным образом повреждаются при загрузке с флэш-накопителя USB.Я скачал несколько копий одного и того же файла, и ошибки кажутся в целом уникальными и случайными для каждой копии.

Таким образом, мне нужен скрипт для сравнения нескольких (от 3 до 5) битых копий одного и того же файла (~ 100 МБ каждая) и 'голосуйте' за правильное значение для каждого байта, добавляя его впоследствии к выходному файлу.

Есть ли быстрый и простой способ реализовать это в Python 3?

1 Ответ

0 голосов
/ 29 мая 2018

Объедините потоки байтов вместе и используйте Counter, чтобы получить согласованный байт в каждой позиции.

from functools import partial
from collections import Counter
from contextlib import ExitStack
from mmap import mmap, PROT_READ

fnames = ["t1.txt", "t2.txt"]

with ExitStack() as stack:
    fhs = [stack.enter_context(open(f, 'rb')) for f in fnames]
    out = stack.enter_context(open("fixed", 'wb'))
    streams = [mmap(f.fileno(), 0, prot=PROT_READ) for f in fhs]
    for bs in zip(*streams):
        c = Counter(bs)
        out.write(c.most_common(1)[0][0])
...