Python实现大CSV文件切割成多个小文件或转换为Excel文件的方法解析

python切割大文件csv,分为多个小csv文件或转为Excel文件

  • 一、简介
  • 二、功能介绍
  • 三、项目
  • 1.环境要求
  • 1.python安装
  • 2.安装依赖
  • 2.代码
  • 1. 切割csv文件 (保存单文件数据量为1百万)
  • 2. csv文件转excel (保存单文件数据量为1百万)
  • 3. 读取csv文件路径及保存目标文件的路径
  • 4. 主程序
  • 3.测试截图
  • 注意事项
  • 一、简介

    在工作中,我们经常需要导出大量数据,但Excel表格只能支持大约100万行的数据量。对于超过这个限制的数据,我们只能导出为CSV文件。然而,CSV文件是纯文本格式,直接用Excel打开时,可能会出现数据失真问题,如乱码或数字过长导致的科学计数法显示。为了解决这些问题,本工具提供了将CSV文件拆分和转换为Excel文件的功能。

    二、功能介绍

    1. CSV文件拆分:将一个大的CSV文件拆分成多个小的CSV文件,每个文件包含不超过100万行的数据。(默认是超过100行数据拆分)
    2. CSV转Excel:将CSV文件转换为Excel文件,同时处理可能的乱码和科学计数法问题。

    三、项目

    1.环境要求

    1. Python 3.x
    2. pandas库
    3. openpyxl库
    4. xlsxwriter库

    1.python安装

    python官网.进入 python 下载页面
    在下载页面可以看到很多不同版本的下载链接。其中,标记 x86 的为 32 位安装包,x86-64 为 64 位安装包。对于Windows操作系统,可以下载“executable installer”。

    下载后进行安装,执行安装向导的时候,记得勾选“Add Python 3.x to PATH”选项,这个选项会帮助我们将Python的解释器添加到PATH环境变量中,如不勾选,需要自己配置环境变量

    参考安装教程

    python 编辑工具推荐:pycharm
    pycharm官网

    2.安装依赖

    pip install pandas openpyxl xlsxwriter tkinter pyinstaller
    
    使用临时镜像下载
    pip install pandas openpyxl xlsxwriter -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
    
    设置全局镜像
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
    
    pip install pandas openpyxl xlsxwriter tkinter pyinstaller
    

    2.代码

    1. 切割csv文件 (保存单文件数据量为1百万)

    
    import pandas as pd
    import numpy as np
    
    # 文件路径(读取,保存)
    import path
    
    
    def csvToSplit():
        # 需拆分的 csv 文件路径
        source_path = 'source_csv'
        # 拆分后 csv 文件路径
        output_folder = 'data/split_csv'
    
        file_name, file_path = path.read_path(source_path)
        if file_name == -1:
            raise ValueError(file_path)
        outfile_path = path.output_path(file_name, output_folder)
        # 读取csv 文件
        df = pd.read_csv(file_path)
    
        # 保存单文件 1百万 数据
        size = 1000000
        # size = 100
        if int(len(df) / size) == 0:
            raise ValueError(f'该文件数据量未达到百万,无需拆分')
        res = divmod(len(df), size)
        num = res[0]
        # excel 最大支持行数为 1048576,当余数大于 48576 时 分片数 +1
        # 判断 余数 大于 0 也是一样的
        if res[1] > 48576:
        	num = num + 1
        print(f'------ csv文件拆分 begin------')
        # 单文件会查过百万(会平均分布的)
        for i, chunk in enumerate(np.array_split(df, len(df) / size)):
            chunk.to_csv(f'{outfile_path}/{file_name}_{i}.csv', index=False)
            print(f'------ 第{i}个csv文件生成成功 ------')
        print(f'------ csv文件拆分 end------')
    
    

    2. csv文件转excel (保存单文件数据量为1百万)

    import pandas as pd
    import numpy as np
    
    # 文件路径(读取,保存)
    import path
    
    
    def csvToExcel():
        # 读取 csv 文件路径
        source_path = 'source_csv'
        # csv转换excel后 保存 文件路径
        output_folder = 'data/toExcel_xlsx'
    
        file_name, file_path = path.read_path(source_path)
        if file_name == -1:
            raise ValueError(file_path)
        outfile_path = path.output_path(file_name, output_folder)
        # 读取csv 文件
        df = pd.read_csv(file_path)
    
        # 保存单文件 1百万 数据
        size = 1000000
    
        # 如果文件小于 1百万数据则 直接转换为excel表格
        # 如果文件大于 1百万数据则 进行拆分后再转换为excel表格
        print(f'------ csv文件转换 begin------')
        if len(df) <= size:
            df.to_excel(f'{outfile_path}/{file_name}.xlsx', index=False)
        elif len(df) > size:
            print(f'------ csv文件数据大于 1百万,先进行csv文件拆分 ------')
            res = divmod(len(df), size)
        	num = res[0]
       	 	# excel 最大支持行数为 1048576,当余数大于 48576 时 分片数 +1
        	# 判断 余数 大于 0 也是一样的
        	if res[1] > 48576:
        		num = num + 1
            # 单文件会查过百万(会平均分布的)
            for i, chunk in enumerate(np.array_split(df, len(df) / size)):
                # chunk.to_csv(f'{outfile_path}/{file_name}_{i}.csv', index=False)
                pd.DataFrame(chunk).to_excel(f'{outfile_path}/{file_name}_{i}.xlsx', index=False)
                print(f'------ 第{i}个csv文件转换成功 ------')
        print(f'------ csv文件转换 end------')
    

    3. 读取csv文件路径及保存目标文件的路径

    # 读取csv文件路径
    # 保存 目标文件的路径
    
    import pandas as pd
    import os
    from datetime import datetime
    
    
    # 读取 文件路径
    def read_path(folder_path):
        # 列出文件夹中所有csv文件
        csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]
        # 文件夹中csv文件必须一个(暂支持一个文件)
        if len(csv_files) > 1:
            return -1, '文件夹中有多个csv文件,目前只支持一个csv文件!'
        files = csv_files[0]
        # 获取文件名
        file_name = files.split('.', 1)[0]
        file_path = os.path.join(folder_path, files)
        return file_name, file_path
    
    
    # 保存 文件路径
    def output_path(file_name, output_folder):
        # 获取当前日期
        current_date = datetime.now()
        # 将日期格式化为 yyyymmdd 格式
        formatted_date = current_date.strftime('%Y%m%d')
    
        # 文件输出路径(以时间做区分)
        outfile_path = os.path.join(output_folder, file_name + '-' + formatted_date)
        # 如果输出文件夹不存在,则创建
        if not os.path.exists(outfile_path):
            os.makedirs(outfile_path)
        return outfile_path
    
    

    4. 主程序

    # csv文件拆分
    import csvToSplit
    # csv 转 excel
    import csvToExcel
    
    
    def main(type):
        if type == 0:
            csvToSplit.csvToSplit()
        elif type == 1:
            csvToExcel.csvToExcel()
    
    
    if __name__ == '__main__':
        try:
            num = int(input("请选择0:拆分csv;1:csv转excel:"))
            main(num)
        except ValueError as e:
            print("ERROR: " + e)
    

    3.测试截图

    1. csv转excel

    csv转excel
    成功后会在data/toExcel_xlsx 中生成转换后的文件


    1. csv拆分

    csv 文件未达到百万数据,会提示

    成功后会在data/split_csv 中生成转换后的文件

    注意事项

  • 确保安装了所有必要的Python库。
  • 根据实际需要修改代码中的文件路径和参数(默认是百万)。
  • 如果直接使用需要在当前目录创建 source_csv和data 文件夹(即与main.py文件在同一目录下)
  • 作者:Harmon-x

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python实现大CSV文件切割成多个小文件或转换为Excel文件的方法解析

    发表回复