python将超大CSV文件切割为多个Excel文件存储
程序员文章站
2024-03-15 08:38:47
...
很多时候处理数据会碰到CSV文件,如果是一般的少量文件问题不大,一旦碰到大型的CSV文件,就会出现打不开文件的结果。因为文本无法打开超大型文件,Excel也最多能够容量一百万条数据量,因此只能将CSV文件切割成为多个小的CSV文件。
将csv分割为多个excel文件的方法:
① 将csv文件读取进来
② 将需要的数据存储,不需要的数据过滤掉
③ 将处理过的文件存储到excel表格中
1、读取csv文件
(1)获取当前目录下的csv文件名称
#创建一个空列表,存储当前目录下的CSV文件全称
file_name = []
#获取当前目录下的CSV文件名
def name():
a = os.listdir()
for j in a:
if os.path.splitext(j)[1] == '.csv':
file_name.append(j)
(2)读取csv文件,并存储到列表中
#将CSV文件内容导入到csv_storage列表中
def csv_new(storage,name):
csv_storage = []
sum = 0
#显示保存的第几个文件
file_sum = 0
#打开读取csv文件
with codecs.open(storage, 'r', encoding='utf-8') as fp:
fp_key = csv.reader(fp)
for csv_key in fp_key:
csv_reader = csv.DictReader(fp, fieldnames=csv_key)
for row in csv_reader:
sum += 1
#切割为50000个数据一份
if sum < 50000:
csv_dict = dict(row)
csv_storage.append(csv_dict)
else:
sum = 0
file_sum += 1
extract(csv_storage,name,file_sum)
csv_storage = []
continue
2、将数据进行筛选、过滤
#将提取csv_storage列表中有用的数据
def extract(data,name,file_sum):
csv_storages = []
#将数据进行筛选
for x in range(0,len(data)):
arrays = {'road_name':'','bus_plate':'','time':'','road_type':'','site':'','site_name':'','time_date':''}
arrays['road_name'] = data[x]['RoadName']
arrays['bus_plate'] = data[x]['BusPlate']
#含有时间类型的数据需要进行转换
arrays['time'] = datetime.datetime.strptime(data[x]['GpsDate'],'%Y-%m-%d %H:%M:%S')
arrays['road_type'] = data[x]['RoadType']
arrays['site'] = data[x]['SiteNo']
arrays['site_name'] = data[x]['SiteName']
arrays['time_date'] = datetime.datetime.strptime(data[x]['GpsDate'],'%Y-%m-%d %H:%M:%S').date()
csv_storages.append(arrays)
3、将列表存储为Excel表格文件
#将列表文件导出为excel表格文件
def export_excel(export,name,file_sum):
#将字典列表转换为DataFrame
pf = pd.DataFrame(list(export))
#指定字段顺序
order = ['road_name','bus_plate','time','road_type','site','site_name','time_date']
try:
pf = pf[order]
#将列名替换为中文
columns_map = {
'road_name':'路线',
'bus_plate':'车牌',
'time':'时间',
'road_type':'方向',
'site':'站点',
'site_name':'站点名称',
'time_date':'日期'
}
pf.rename(columns = columns_map,inplace = True)
#指定生成的Excel表格名称
name = name.replace('csv','xlsx')
name = 'new_' + str(file_sum) + '_' + name
file_path = pd.ExcelWriter(name)
#替换空单元格
pf.fillna(' ',inplace = True)
#输出
pf.to_excel(file_path,encoding = 'utf-8',index = False)
try:
#保存表格
file_path.save()
print("已经保存" + name + "文件")
except PermissionError:
print("Excel文件未保存,文件被打开")
except KeyError:
print("需要保存的文件内容不同")
全部代码如下:
#!/usr/bin/env python
# coding=utf-8
import codecs
import csv
import datetime
import time
import xlwt
from xlutils.copy import copy
import pandas as pd
import os
import operator
#创建一个空列表,存储当前目录下的CSV文件全称
file_name = []
#获取当前目录下的CSV文件名
def name():
a = os.listdir()
for j in a:
if os.path.splitext(j)[1] == '.csv':
file_name.append(j)
#将CSV文件内容导入到csv_storage列表中
def csv_new(storage,name):
csv_storage = []
sum = 0
#显示保存的第几个文件
file_sum = 0
#打开读取csv文件
with codecs.open(storage, 'r', encoding='utf-8') as fp:
fp_key = csv.reader(fp)
for csv_key in fp_key:
csv_reader = csv.DictReader(fp, fieldnames=csv_key)
for row in csv_reader:
sum += 1
#切割为50000个数据一份
if sum < 50000:
csv_dict = dict(row)
csv_storage.append(csv_dict)
else:
sum = 0
file_sum += 1
extract(csv_storage,name,file_sum)
csv_storage = []
continue
#将提取csv_storage列表中有用的数据
def extract(data,name,file_sum):
csv_storages = []
#将数据进行筛选
for x in range(0,len(data)):
arrays = {'road_name':'','bus_plate':'','time':'','road_type':'','site':'','site_name':'','time_date':''}
arrays['road_name'] = data[x]['RoadName']
arrays['bus_plate'] = data[x]['BusPlate']
#含有时间类型的数据需要进行转换
arrays['time'] = datetime.datetime.strptime(data[x]['GpsDate'],'%Y-%m-%d %H:%M:%S')
arrays['road_type'] = data[x]['RoadType']
arrays['site'] = data[x]['SiteNo']
arrays['site_name'] = data[x]['SiteName']
arrays['time_date'] = datetime.datetime.strptime(data[x]['GpsDate'],'%Y-%m-%d %H:%M:%S').date()
csv_storages.append(arrays)
export_excel(sorted_x,name,file_sum)
#将列表文件导出为excel表格文件
def export_excel(export,name,file_sum):
#将字典列表转换为DataFrame
pf = pd.DataFrame(list(export))
#指定字段顺序
order = ['road_name','bus_plate','time','road_type','site','site_name','time_date']
try:
pf = pf[order]
#将列名替换为中文
columns_map = {
'road_name':'路线',
'bus_plate':'车牌',
'time':'时间',
'road_type':'方向',
'site':'站点',
'site_name':'站点名称',
'time_date':'日期'
}
pf.rename(columns = columns_map,inplace = True)
#指定生成的Excel表格名称
name = name.replace('csv','xlsx')
name = 'new_' + str(file_sum) + '_' + name
file_path = pd.ExcelWriter(name)
#替换空单元格
pf.fillna(' ',inplace = True)
#输出
pf.to_excel(file_path,encoding = 'utf-8',index = False)
try:
#保存表格
file_path.save()
print("已经保存" + name + "文件")
except PermissionError:
print("Excel文件未保存,文件被打开")
except KeyError:
print("需要保存的文件内容不同")
#主要运行函数
if __name__ == '__main__':
name()
print("总共有如下文件:")
print(file_name)
for name in file_name:
csv_new(name,name)
这样就可以完成将超大型csv文件进行切割的任务了。
上一篇: NOI:7909 统计数字
下一篇: NOI:3089 爬楼梯