6.python学习笔记:切分大型文件

大型文件的切分

在shell编程中有一组操作可以切分和合并大型文件,解决了因存储过小而不能在一个设备中存储的尴尬,命令是:

切分:
split -b 5m redhat6.5.iso redhat

-b 指定了每块子文件的大小 (适用于二进制文件
-l 指定了每个子文件的行数(适用于文本文件)

合并:

cat redhat* > redhat6.5.iso


如果你对shell 自带的切分合并操作不习惯,完全可以自己开发一套切分操作,我们这里命名为split.py。

split.py的内容如下所示:


#encoding:utf-8
#!/usr/bin/env python


#该程序将指定的大型文件切分成n个指定的小块(块的大小也可以指定)

import os
import sys

kilobytes = 1024
megabytes = kilobytes * 1024
chunksize = int(1.4 * megabytes)

def split(fromfile, todir, chunksize=chunksize):
    #如果目标目录不存在则创建,否则删除原有的文件
    if not os.path.exists(todir) :
        os.mkdir(todir)
    else :
        for fname in os.listdir(todir) :
            os.remove(os.path.join(todir, fname))
    partnum = 0
    inputfile = open(fromfile, 'rb')
    #开始进行切分并且创建切分文件
    while True :
        chunk = inputfile.read(chunksize)
        if not chunk :
            break
        partnum += 1
        filename = os.path.join(todir, ('part%04d' % partnum))
        fileobj = open(filename, 'wb')
        fileobj.write(chunk)
        fileobj.close()
        print ("%s has been create." % (fileobj))
    inputfile.close()
    assert partnum <= 9999
    return partnum


if __name__ == "__main__":
    #首先进行参数检测
    if len(sys.argv) == 2 and sys.argv[1] == '-help' :
        print ('Use: split.py [file-to-split target-dir [chunksize]]')
    else :
        #用户将切分的源文件和目标地址没有进行参数传递,而是手动输入
        if len(sys.argv) < 3 :
            interactive = true
            fromfile = raw_input('split file:')
            todir = raw_input('directory to store part file:')
        else :
            interactive = False
            fromfile, todir = sys.argv[1:3]    #通过命令行参数传递
            if len(sys.argv) == 4 :
                chunksize = int(sys.argv[3])
        absfrom, absto = map(os.path.abspath, [fromfile, todir])

        print ('Splitting ', absfrom, ' to ', absto, ' by ', chunksize)
        try :
            parts = split(fromfile, todir, chunksize)
        except :
            print ('Error during split.')
            print (sys.exc_info()[0], sys.exc_info()[1])
        else :
            print ('Split finished: ', parts, " parts are in ", absto)

        if interactive :
            input('Press Enter key')        

split.py的参数最多有三个:

fromfile 要切分的大文件
todir 放置切分文件的目录
chunksize 每个切分文件的大小

使用命令操作如下:

python split.py /tools/redhat-enterprise6.5x86_64.iso /haha

完了之后在/haha目录下会生成很多切分好的文件:
6.python学习笔记:切分大型文件_第1张图片

可是这些碎片文件只有进行拼接才可以使用,关于碎片文件的合并在下一章节进行介绍。

你可能感兴趣的:(python)