完成大文件按规则拆解。使用python实现将5个多g,总共五千万行数据的csv文件进行按照某个特殊时属性进行拆解。
问题难点:文件过大,服务器内存资源不足,需要分块读入内存并处理。之前想着一次性全部读入,然后再根据分类条件写入对应文件,但是总会出现内存溢出(因为一次性读入之后需要分类排序)或者执行效率过低(因为需要一条条的分类然后一条条的插入文件)的问题。
解决方案:使用pandas分块读取文件内容,然后依次分类处理。其中补充了较多的日志信息,便于查看。
因为是脚本执行,所以使用命令行将日志导入到log文件中去。python 脚本.py >> log.log 2>&1
代码如下:
import pandas as pd
from pathlib import Path
# 批量分块读取csv并处理 success
# 读取原始 CSV 文件
input_file_path = '你自己的文件.csv'
chunk_size = 100000 # 每次读取的行数
num = 0
# 遍历文件,逐块读取
for chunk in pd.read_csv(input_file_path, chunksize=chunk_size):
# 根据 terminalId 拆分数据框
grouped_df = chunk.groupby('terminalId')
print("大块数量:" + str(len(grouped_df)) + "==========================")
# 遍历每个分组,保存为单独的 CSV 文件
for terminal_id, group_df in grouped_df:
# 指定保存路径和文件名,可以根据需要自定义
output_file_path = f'/home/user/tstar/handleCsv/data/batch/{terminal_id}.csv'
# output_file_path = f'{terminal_id}.csv'
print("tId:" + str(terminal_id) + ",group.size = "+ str(len(group_df)) + "=====")
num += len(group_df)
print("num:" + str(num))
# 判断文件是否存在,如果已经存在,则将该部分写入已经存在的文件中
file_path = Path(output_file_path)
# 如果文件存在,则将数据追加到文件末尾
if file_path.exists():
print(str(terminal_id) + "存在")
group_df.to_csv(output_file_path, mode='a', header=False, index=False)
else:
# 该文件不存在,则保存分组数据框,保持表头相同
print(str(terminal_id) + "文件不存在")
group_df.to_csv(output_file_path, index=False)
print("全部读取完成:num=" + str(num))
标签:文件,数据量,Python,df,str,file,path,csv,心得
From: https://www.cnblogs.com/BananaMan666/p/18015987