分享一个基于python的将一个大excel拆成多个小excel,并压缩成一个文件

应用场景是这样的,一个大CSV文件很大,需要拆开分给不同人处理,注解看代码,缺少包自己安装呢

import pandas as pd,os,math,zipfile,shutil



#原 CSV的路径
CSV_Path = '/Users/huangmengfeng/Downloads/lalala.csv'
#输出 文件的文件夹,确保文件夹存在
OUT_Dir = '/Users/huangmengfeng/Desktop/CSV_TO_XLSX'
#每个小文件的条数
Ad_Nums = 200



#如果文件夹不存在则创建文件夹
def makeDir(dir):
    if not os.path.exists(dir):
        os.mkdir(dir)




#压缩文件
def zip_ya(startdir,file_news):
    z = zipfile.ZipFile(file_news,'w',zipfile.ZIP_DEFLATED) #参数一:文件夹名
    for dirpath, dirnames, filenames in os.walk(startdir):
        fpath = dirpath.replace(startdir,'') #这一句很重要,不replace的话,就从根目录开始复制
        fpath = fpath and fpath + os.sep or ''#这句话理解我也点郁闷,实现当前文件夹以及包含的所有文件的压缩
        for filename in filenames:
            z.write(os.path.join(dirpath, filename),fpath+filename)
            print ('压缩成功')
    z.close()



#读取CSV
if __name__ == '__main__':
    #愿路径的文件名
    sourec_file_name = os.path.basename(CSV_Path)
    #创建文件夹
    makeDir(OUT_Dir)
    Tmp_Out_Dir = OUT_Dir + '/tmp'
    if os.path.exists(Tmp_Out_Dir):
        shutil.rmtree(Tmp_Out_Dir)
    makeDir(Tmp_Out_Dir)
    #读取csv文件
    dtype = {'dst_url': str, 'src_url': str}
    csv_data_frame = pd.read_csv(CSV_Path,dtype=dtype) if sourec_file_name.endswith('.csv') else pd.read_excel(CSV_Path,dtype=dtype)
    print(csv_data_frame.shape)
    #获得总条数
    total_nums = csv_data_frame.shape[0]
    #获得总文件数
    file_nums = math.ceil(total_nums/Ad_Nums)
    #遍历csv 拆成小文件
    tmp_data_arr = []
    count_start = 0
    count_end = Ad_Nums if file_nums > 1 else total_nums
    tig_num = 0
    for (index,row) in csv_data_frame.iterrows():
        tmp_data_arr.append(row)
        if index == count_end - 1 :
            tmp_data_frame = pd.DataFrame(tmp_data_arr)
            tmp_file_name = '{0}/{1}_{4}_{2}-{3}.xlsx'.format(Tmp_Out_Dir,sourec_file_name.split('.')[0],count_start,count_end-1,tig_num)
            csv_write = pd.ExcelWriter(tmp_file_name,engine='xlsxwriter',options={'strings_to_urls':False})
            tmp_data_frame.to_excel(csv_write, index=False)
            csv_write.close()
            tmp_data_arr = []
            count_start += 200
            count_end = count_end + 200 if count_end + 200 <= total_nums else total_nums
            tig_num += 1
    out_zip_path = '{0}/{1}.zip'.format(OUT_Dir,sourec_file_name.split('.')[0])  # 压缩后文件夹的名字
    zip_ya(Tmp_Out_Dir,out_zip_path)

对了再附送一个将文件夹的文件合成一个大文件的脚本,不客气

import pandas as pd,os



#合成文件的路径
CSV_Path = '/Users/huangmengfeng/Desktop/lalala_out.csv'
#需要合成的文件的文件夹,确保文件夹存在
Source_Dir = '/Users/huangmengfeng/Desktop/CSV_TO_XLSX/tmp'



#读取CSV
if __name__ == '__main__':

    tmp_file_name_arr = []
    for file in os.listdir(Source_Dir):
        if os.path.isfile(os.path.join(Source_Dir,file)) and file.endswith('.xlsx'):
            tmp_file_name_arr.append(file)
    tmp_file_name_arr.sort()
    print(tmp_file_name_arr)
    total_arr = []
    for file in tmp_file_name_arr:
        tmp_df = pd.read_excel(os.path.join(Source_Dir, file), dtype={'dst_url': str, 'src_url': str})
        total_arr.append(tmp_df)
    total_df = pd.concat(total_arr)
    total_df.to_csv(CSV_Path,index=False)

 

你可能感兴趣的:(偷懒和心存侥幸的python)