Python 处理大数据量(百万行)csv文件(已封装API)
前言
python 一门神奇的语言,前几年一直流传一句话“人生苦短,我用python”;确实有一个神奇现象,1991年出现的 python 语法居然比后来出现的java 语法更简单。
公司最近有一个处理,大数据 量csv文件的需求,用python 写了一个demo(此demo 基于pandas实现)
1. pandas
1.1 简介:
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
1.2 数据结构
Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
Time- Series:以时间为索引的Series。
DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。
Panel :三维的数组,可以理解为DataFrame的容器。
Panel4D:是像Panel一样的4维数据容器。
PanelND:拥有factory集合,可以创建像Panel4D一样N维命名容器的模块。
2. 源码
# -*- coding: utf-8 -*-
import logging
import pandas as pd
import json
import time
from flask import Flask, request
from pydantic import BaseModel
app = Flask(__name__)
logger = logging.getLogger(__name__)
logging.basicConfig(
format='%(pathname)s - %(filename)s - %(lineno)d - %(asctime)s - %(levelname)s: %(message)s',
level=logging.DEBUG)
@app.route('/deal/csv', methods=['post'])
def deal_csv():
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
data = request.get_data();
if data is None:
return null;
param = json.loads(data);
if param is None:
return null;
csv_file = param['csv_file'];
new_csv = param['new_csv'];
columns = param['columns'];
filter = param['filter'];
if columns is None:
return null;
try:
resourceFile = pd.read_csv(csv_file, index_col=0, encoding="gbk")
except Exception as e:
logger.error("读取文件失败:" + str(e))
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
# 列名 数组
allcolumns = resourceFile.columns.values;
# 找出 需要删除的 列
theColumns = list(set(allcolumns).difference(set(columns)));
# 构建dataFrame
df = pd.DataFrame(resourceFile)
# 组装过滤条件
filterlist = []
for (k, v) in filter.items():
v = v.replace(k, "df['" + k + "']");
filterlist.append(v)
# 拼装filter 过滤条件
conditions='';
for filterItem in filterlist:
if len(conditions) == 0:
conditions = filterItem
else:
conditions = conditions + " & " + filterItem
logging.info(conditions)
#
# try:
# # 过滤操作
# # tick_New = df[eval(conditions)]
# tick_New = df[df['id']>1]
# except Exception as e:
# logger.error("过滤操作失败:"+str(e))
df_New = df[eval(conditions)]
# 删除列
df.drop(theColumns, axis=1, inplace=True)
# try:
# # 删除列
# df_New.drop(theColumns, axis=1, inplace=True)
# except Exception as e:
# logger.error("过滤列失败:"+str(e))
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
# 写到新的 文件
df.to_csv(new_csv, index=False)
# try:
# # 写到新的 文件
# df_New.to_csv(new_csv, index=False)
# except PermissionError as e:
# logger.error('Faild to write file'+ str(e))
logger.info('Finished')
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
return 'success'
if __name__ == '__main__':
app.run(debug=True,
port=50010,
host='0.0.0.0')
3. test
3.1 url
http://127.0.0.1:50010/deal/csv
3.2 param
{
"csv_file":"D:/aa/aa/aa/res.csv",
"new_csv":"D:/aa/aa/aa/res_02.csv",
"columns":["一名"],
"filter":{
"一名": "(一名>2)"
}
}
3.3 result
欢迎大家留言 ,点赞收藏
虚心接受,及时更正