Python二进制方式将均等切分文件并还原

Posted 小基基o_O

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python二进制方式将均等切分文件并还原相关的知识,希望对你有一定的参考价值。

场景

  • 文件传输大小限制时,需要将文件切小,分别发送,合并还原
  • 文件发送限制(比如:破解软件、小电影…)

切分原理图

代码实现

切分方式(图左)

# 源文件名
SOURCE = 'scala-intellij-bin-2020.3.1.zip'
# 切成多少个文件,奇数
N = 9
# 还原文件的路径
restore = 'restore_' + SOURCE


def rb(abs_path):
    """二进制方式读取文件"""
    with open(abs_path, 'rb') as f:
        return f.read()


def wb(abs_path, s):
    """二进制方式写文件"""
    with open(abs_path, 'wb') as f:
        f.write(s)


def split():
    """文件切分"""
    frb = rb(SOURCE)
    each = int(len(frb) // N) + 1
    for i in range(N):
        wb(str(i), frb[i * each: (i + 1) * each])


def combine():
    """合并分片,还原文件"""
    with open(restore, 'wb') as f:
        for i in range(N):
            f.write(rb(str(i)))


if __name__ == '__main__':
    split()
    combine()

切分方式(图右)

import os

# 源文件名
SOURCE = '待切文件'
# 切成多少个文件,奇数
N = 9

# 路径设置
path = os.path.dirname(__file__)
# 源文件绝对路径
source = os.path.join(path, SOURCE)
# 源文件切分后,存到此文件夹
fragment = os.path.join(path, 'fragment/')
if not os.path.exists(fragment):
    os.mkdir(fragment)
# 还原文件的绝对路径
restore = os.path.join(fragment, SOURCE)


def rb(abs_path):
    """二进制方式读取文件"""
    with open(abs_path, 'rb') as f:
        return f.read()


def split():
    """文件切分"""
    frb = rb(source)
    f_ls = [open(os.path.join(fragment, str(i)), 'wb') for i in range(N)]
    for i in range(len(frb)):
        if i % 2 == 0:
            f_ls[i % N].write(frb[i: i + 2])
    for f in f_ls:
        f.close()


def combine():
    """合并分片,还原文件"""
    f = open(restore, 'wb')
    fb_ls = [rb(os.path.join(fragment, str(i))) for i in range(N)]
    le = sum(len(frb) for frb in fb_ls)
    for i in range(le):
        if i % 2 == 0:
            f.write(fb_ls[i % N][int(((i / 2) // N) * 2): int(((i / 2) // N) * 2) + 2])
    f.close()


def checkout():
    """计算还原率"""
    o = rb(source)
    t = sum(i == j for i, j in zip(rb(restore), o))
    print('还原率', t / len(o))


if __name__ == '__main__':
    split()
    combine()
    checkout()

以上是关于Python二进制方式将均等切分文件并还原的主要内容,如果未能解决你的问题,请参考以下文章

基于文件组备份还原

如何将Python打包后的exe还原成.py?

如何将Python打包后的exe还原成.py?

Python机器学习(二十)决策树系列三—CART原理与代码实现

记一次从Sql Server中图片二进制流还原回图片的开发过程

使用Logstash filter grok过滤日志文件