Bootstrap

Python 处理大数据量(百万行)csv文件(已封装API)

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

在这里插入图片描述
在这里插入图片描述

欢迎大家留言 ,点赞收藏
虚心接受,及时更正

;