来源:(3条消息) python实现大型CSV文件的切割(以NGSIM数据为例)_惜君如常的博客-CSDN博客_csv文件切割
从阿里云获得了一个用户行为的数据集,包含一亿多条数据。由于文件太大,想用常规方法读取时会出现内存溢出的情况,因此参考了原博的代码做了分割
import pandas as pd from pathlib import Path res_file_path = Path(r"UserBehavior.csv") # 待分割文件路径 split_size = 1000000 # 子文件行数最大值 tar_dir = res_file_path.parent / ("split_" + res_file_path.name.split(".")[0]) if not tar_dir.exists(): tar_dir.mkdir() print("创建文件夹\t" + str(tar_dir)) print("目标路径:\t" + str(tar_dir)) print("分割文件:\t" + str(res_file_path)) print("分割大小:\t" + "{:,}".format(split_size)) tmp = pd.read_csv(res_file_path, nrows=10) columns = tmp.columns.to_list() idx = 0 while len(tmp) > 0: start = 1 + (idx * split_size) tmp = pd.read_csv(res_file_path, header=None, names=columns, skiprows=start, nrows=split_size) if len(tmp) <= 0: break file_name = res_file_path.name.split(".")[0] + "_{}_{}".format(start, start + len(tmp)) + ".csv" file_path = tar_dir / file_name tmp.to_csv(file_path, index=False) idx += 1 print(file_name + "\t保存成功")
只需要修改文件路径即可
在分割完成后,我得到了76个csv文件
之后从每个文件中随机抽取数据,合并为我最终要拿来数据分析的文件
import random new_f = open('./random_combine_UserBehavior.csv', 'w', encoding='UTF-8') # 最终生产数据文件路径 for i in range(1, 77): x = i*1000000+1 y = (i+1)*1000000+1 file_name = 'UserBehavior_'+str(x)+'_'+str(y)+'.csv' old_f = open('./split_UserBehavior/'+str(file_name), 'r', encoding='UTF-8') n = 0 resultList = random.sample(range(0, 1000000), 10000) # 每个文件随机抽取10000条数据 lines = old_f.readlines() for j in resultList: new_f.write(lines[j]) old_f.close() print('第'+str(i)+'个文件已抽取完成') # 抽取进度提示 new_f.close()
此外,为方便数据处理,用Excel把时间戳转换为时间
时间戳转正常日期
F1=(E1+8*3600)/86400+70*365+19
正常日期转时间戳
E1=(F1-70*365-19)*86400-8*3600
要调整是否显示精确时间,在数字格式进行设置即可