Python实现大CSV文件切割成多个小文件或转换为Excel文件的方法解析
python切割大文件csv,分为多个小csv文件或转为Excel文件
一、简介
在工作中,我们经常需要导出大量数据,但Excel表格只能支持大约100万行的数据量。对于超过这个限制的数据,我们只能导出为CSV文件。然而,CSV文件是纯文本格式,直接用Excel打开时,可能会出现数据失真问题,如乱码或数字过长导致的科学计数法显示。为了解决这些问题,本工具提供了将CSV文件拆分和转换为Excel文件的功能。
二、功能介绍
- CSV文件拆分:将一个大的CSV文件拆分成多个小的CSV文件,每个文件包含不超过100万行的数据。(默认是超过100行数据拆分)
- CSV转Excel:将CSV文件转换为Excel文件,同时处理可能的乱码和科学计数法问题。
三、项目
1.环境要求
- Python 3.x
- pandas库
- openpyxl库
- 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.测试截图
- csv转excel
成功后会在data/toExcel_xlsx 中生成转换后的文件
- csv拆分
csv 文件未达到百万数据,会提示
成功后会在data/split_csv 中生成转换后的文件
注意事项
作者:Harmon-x