# 源文件名
SOURCE ='scala-intellij-bin-2020.3.1.zip'# 切成多少个文件,奇数
N =9# 还原文件的路径
restore ='restore_'+ SOURCE
defrb(abs_path):"""二进制方式读取文件"""withopen(abs_path,'rb')as f:return f.read()defwb(abs_path, s):"""二进制方式写文件"""withopen(abs_path,'wb')as f:
f.write(s)defsplit():"""文件切分"""
frb = rb(SOURCE)
each =int(len(frb)// N)+1for i inrange(N):
wb(str(i), frb[i * each:(i +1)* each])defcombine():"""合并分片,还原文件"""withopen(restore,'wb')as f:for i inrange(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/')ifnot os.path.exists(fragment):
os.mkdir(fragment)# 还原文件的绝对路径
restore = os.path.join(fragment, SOURCE)defrb(abs_path):"""二进制方式读取文件"""withopen(abs_path,'rb')as f:return f.read()defsplit():"""文件切分"""
frb = rb(source)
f_ls =[open(os.path.join(fragment,str(i)),'wb')for i inrange(N)]for i inrange(len(frb)):if i %2==0:
f_ls[i % N].write(frb[i: i +2])for f in f_ls:
f.close()defcombine():"""合并分片,还原文件"""
f =open(restore,'wb')
fb_ls =[rb(os.path.join(fragment,str(i)))for i inrange(N)]
le =sum(len(frb)for frb in fb_ls)for i inrange(le):if i %2==0:
f.write(fb_ls[i % N][int(((i /2)// N)*2):int(((i /2)// N)*2)+2])
f.close()defcheckout():"""计算还原率"""
o = rb(source)
t =sum(i == j for i, j inzip(rb(restore), o))print('还原率', t /len(o))if __name__ =='__main__':
split()
combine()
checkout()