'''
合并split.py创建的目录下的所有组分文件以重建文件。
依赖文件名的排序:长度必须一致。
''' import os,sys
readsize=1024 def join(fromdir,tofile):
output=open(tofile,'wb')
parts=os.listdir(fromdir)
parts.sort()
for filename in parts:
filepath=os.path.join(fromdir,filename)
fileobj=open(filepath,'rb')
while True:
filebytes=fileobj.read(readsize)
if not filebytes:break
output.write(filebytes)
fileobj.close()
output.close() if __name__ == '__main__':
if len(sys.argv)==2 and sys.argv[1]=='-help':
print('Use:join.py [from-dir-name to-file-name]')
else:
if len(sys.argv)!=3:
interactive=True
fromdir=input('Directory containing part files?')
tofile=input('Name of file to be recreated?')
else:
interactive=False
fromdir,tofile=sys.argv[1:]
absfrom,absto=map(os.path.abspath,[fromdir,tofile])
print('Joining',absfrom,'to make',absto) try:
join(fromdir,tofile)
except:
print('Error joinning files')
print(sys.exc_info()[0],sys.exc_info()[1])
else:
print('Join complete:see',absto)
if interactive:input('Press Enter key')
必要时,自己可能还要运行rar解压缩档案文件。
此脚本使用os.listdir目录下的所有组分文件,然后对文件名列表排序以便将各个组分文件按正确的顺序拼装回去。然后逐字节复制。
注意:
1、此脚本是在二进制模式下处理文件,每次读取1kb的小块。也可以将单个组分文件一次性地读入:output.write(open(filepath,'rb').read()) ,但这样的弊端是它真正将文件整个一次性载入内存了。
2、文件名排序:此方案依赖于组分文件目录中文件名的排序。它是对os.listdir返回的文件名调用了列表的sort方法,它隐式的要求创建分割文件时要有一致的长度和格式。为了满足这一要求,分割器在字符串格式化表达式中可采用零补齐数字的想法('part%04d'),以确保所有文件名在末尾的数字有着相同的位数(四位数)。排序时,较小数字前的字符零可确保组分文件正确排序并合并。或者,也可以把文件名中的数字抽出来,转换成int,然后通过列表sort方法的keys参数根据数值大小排序,