一个将大文件分割成不同大小的小文件的程序

文章介绍了一个使用Python编写的程序,该程序可以按用户指定的百分比大小将大文件分割成多个小文件,并提供了相应的合并程序将这些小文件还原。程序包括split和combine两个函数,支持命令行调用,方便使用和集成。
摘要由CSDN通过智能技术生成

这几天遇到个小需求,需要将一个大文件分割成不同大小的小文件。
找遍了各种软件和库包,都没有可以直接使用的,无奈只能自己手撸一个程序出来了。
大致思路为:

入参有3个,分别是:
  1. 输入的大文件位置
  2. 输出的小文件位置
  3. 输出的小文件名前缀
  4. 需要分割出来的每个文件大小,按占大文件的百分比计算
处理逻辑是
  1. 根据输入文件的大小和输入的百分比参数,计算出每个小文件的大小
  2. 根据1的结果按照读取大文件指定大小的内容,然后生成小文件并写入文件内容。
必须有对应的合并程序

有分割程序就必须有对应的合并程序,不然分割出来之后没法还原回去了。

根据以上思路,写出代码:
def split(whole_filename, target_path, target_prefix, target_size_list):
    total_file_size = os.path.getsize(whole_filename)
    last_part_size = total_file_size
    print("split %s to %d parts to %s with prefix %s" % (whole_filename, len(target_size_list), target_path, target_prefix))

    file_size_list = []
    # calculate each file size
    for index in range(len(target_size_list)):
        if index != len(target_size_list) - 1:
            part_size = int(total_file_size * target_size_list[index]) // 100
            file_size_list.append(part_size)
            last_part_size -= part_size
        else:
            file_size_list.append(last_part_size)

    whole_file = open(whole_filename, "rb")
    for index in range(len(target_size_list)):
        part_file = open(os.path.join(target_path, "%s_%d" % (target_prefix, index)), 'wb+')
        context = whole_file.read(file_size_list[index])
        part_file.write(context)
        part_file.close()
    whole_file.close()


def combine(folder, filename_list, target_filename):
    print("combine %d files into %s" % (len(filename_list), target_filename))
    target_file = open(target_filename, "wb+")
    for filename in filename_list:
        part_file = open(os.path.join(folder, filename), "rb")
        target_file.write(part_file.read())
    return
虽然这次只要写出lib来给我的程序调用就行了,但是为了方便以后给别人使用,还是加上命令行调用的方法以及使用说明,这下子就可以当开源软件发布了。
usage = """usages: 
SplitAndCombine split <full_file_name> <target_output_folder_path> <target_part_file_prefix> <percentage_size_list>
    split a file into several part files with different size calculated by percentage

SplitAndCombine combine <folder_path> <target_filename> <part_file_name_1> <part_file_name_2> ...

example
python SplitAndCombine.py split "C:\workspace\BigFile.tar" "C:\workspace" "part" 15 25 34 26
python SplitAndCombine.py combine "C:\workspace" "C:\workspace\BigFile.tar" "part_0" "part_1" "part_2" "part_3"
"""

if __name__ == '__main__':
    if len(sys.argv) < 5:
        print(usage)

    if sys.argv[1] == 'split':
        target_size_list = []
        for index in range(5, len(sys.argv)):
            target_size_list.append(int(sys.argv[index]))
        split(sys.argv[2], sys.argv[3], sys.argv[4], target_size_list)
    elif sys.argv[1] == 'combine':
        target_file_list = []
        for index in range(4, len(sys.argv)):
            target_file_list.append(sys.argv[index])
        combine(sys.argv[2], target_file_list, sys.argv[3])
    else:
        print(usage)

虽然程序不大,但是实现了一个新的需求,还是挺不错的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值