如何将大的 Excel 无损拆分成若干个小文件

前段时间有个同事在项目中遇到一个问题,需求中有一个是将 Excel 文件传入系统,但是上传过程中,发现文件太大,无法上传。因而需要将该大文件拆分成若干个小文件,在上传。
代码如下:

# coding=utf-8
import os
import pandas as pd
import math


def file_split(filename, file_num, header=True):
  # 根据是否有表头执行不同程序,默认是否表头的
    if header:
        # 获得每个文件需要有的行数
        chunksize = 1000000  # 先初始化的chunksize是100W
        data1 = pd.read_csv(open(filename), chunksize=chunksize, sep=',', encoding='utf-8')
        num = 0
        for chunk in data1:
            num += len(chunk)
        chunksize = round(num / file_num + 1)
        # 需要存的file
        head, tail = os.path.splitext(filename)
        data2 = pd.read_csv(open(filename), chunksize=chunksize, sep=',', encoding='utf-8')
        i = 0  # 定文件名
        for chunk in data2:
            chunk.to_csv('{0}_{1}{2}'.format(head, i, tail), header=None, index=False)
            print('保存第{0}个数据'.format(i))
            i += 1
    else:
        # 获得每个文件需要有的行数
        chunksize = 1000000  # 先初始化的chunksize是100W
        data1 = pd.read_csv(open(filename), chunksize=chunksize, header=None, sep=',')
        num = 0
        for chunk in data1:
            num += len(chunk)
        chunksize = round(num / file_num + 1)

        # 需要存的file
        head, tail = os.path.splitext(filename)
        data2 = pd.read_csv(open(filename), chunksize=chunksize, header=None, sep=',')
        i = 0  # 定文件名
        for chunk in data2:
            chunk.to_csv('{0}_{1}{2}'.format(head, i, tail), header=None, index=False)
            print('保存第{0}个数据'.format(i))
            i += 1

if __name__ == '__main__':
    rootdir = "C:/file/wu"
    for parent, dirnames, filenames in os.walk(rootdir):  # 三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字
        for filename in filenames:  # 输出文件信息
            file = os.path.join(parent, filename).replace('\\', '/')  # 输出文件路径信息
            print("文件名为:",filename)
            size = os.path.getsize(file)                              # 读取文件的大小,单位为B
            mb_size = float(size)/(1024*1024)                        # 转化单位为MB
            print("文件大小为{}MB".format(mb_size))
            time = math.ceil(mb_size/100)                           # 拆分文件的次数,以100MB为每个文件的大小
            print("按照每份文件大小100MB,分成{}份".format(time))
            file_split(filename=file, file_num=time, header=False)

代码中解决一个大文件夹下,读取每个子文件夹下所有文件,并以每个小文件大小为 100MB 去拆分。先获取文件的大小,与 100 相除并向上取整,得到需拆分的个数,然后进行无损拆分。实际中可根据需求更改。

执行结果如下:
如何将大的 Excel 无损拆分成若干个小文件