• Python学习笔记:pandas.read_csv分块读取大文件(chunksize、iterator=True)


    一、背景

    日常数据分析工作中,难免碰到数据量特别大的情况,动不动就2、3千万行,如果直接读进 Python 内存中,且不说内存够不够,读取的时间和后续的处理操作都很费劲。

    Pandasread_csv 函数提供2个参数:chunksize、iterator ,可实现按行多次读取文件,避免内存不足情况。

    使用语法为:

    * iterator : boolean, default False
    返回一个TextFileReader 对象,以便逐块处理文件。
    
    * chunksize : int, default None
    文件块的大小, See IO Tools docs for more informationon iterator and chunksize.
    

    测试数据文件构建:

    import pandas as pd
    import numpy as np
    import os
    os.chdir(r'C:Users111Desktop')
    
    np.random.seed = 2021
    df_size = 1000 # 10000000
    
    df = pd.DataFrame({
        'a': np.random.rand(df_size),
        'b': np.random.rand(df_size),
        'c': np.random.rand(df_size),
        'd': np.random.rand(df_size),
        'e': np.random.rand(df_size)
        })
    df.head()
    df.to_csv('data.csv')
    

    二、指定 chunksize 分块读取文件

    pandas.read_csv 参数 chunksize 通过指定一个分块大小(每次读取多少行)来读取大数据文件,可避免一次性读取内存不足,返回的是一个可迭代对象 TextFileReader

    import pandas as pd
    reader = pd.read_csv('data.csv', sep=',', chunksize=10)
    # <pandas.io.parsers.TextFileReader at 0x1fc81f905e0>
    
    for chunk in reader:
        # df = chunk
        # 对 chunk 进行数据处理
        print(type(chunk), chunk.shape)
    '''
    <class 'pandas.core.frame.DataFrame'> (10, 6)
    <class 'pandas.core.frame.DataFrame'> (10, 6)
    <class 'pandas.core.frame.DataFrame'> (10, 6)
    <class 'pandas.core.frame.DataFrame'> (10, 6)
    <class 'pandas.core.frame.DataFrame'> (10, 6)
    '''
    
    for chunk in reader:
        # df = chunk
        # 对 chunk 进行数据处理
        chunk.rename(columns={'Unnamed: 0':'index2'}, inplace=True) # 修改列名
        print(chunk.columns)
    

    三、指定 iterator=True

    指定 iterator=True 也可以返回一个可迭代对象 TextFileReader

    iterator=Truechunksize 可以同时指定使用。

    reader = pd.read_csv('data.csv', sep=',', iterator=True)
    data = reader.get_chunk(5) # 返回N行数据块
    data
    '''
       Unnamed: 0         a         b         c         d         e
    0           0  0.289972  0.717806  0.886283  0.522148  0.976798
    1           1  0.254952  0.048073  0.464765  0.138978  0.983041
    2           2  0.634708  0.533182  0.855981  0.456156  0.620018
    3           3  0.812648  0.024870  0.536520  0.894937  0.102704
    4           4  0.699629  0.038305  0.379534  0.876242  0.906875
    '''
    
    • get_chunk(size) -- 返回一个N行的数据块
    • 每次执行获取N行数据,再次执行,获取下一个数据块
    filePath = r'data_csv.csv'
    f = open(filePath, encoding='utf-8')
    reader = pd.read_csv(f, sep=',', iterator=True)
    data1 = reader.get_chunk(5)
    data2 = reader.get_chunk(6)
    f.close()
    

    读取未知数据文件(超大文件,几GB)前几行,进行数据类型观察、列标签观察等。

    四、其他技巧

    1.获取文件行数

    count = 0
    file = open('data_csv.csv', 'r', encoding='utf-8')
    while 1:
        buffer = file.read(8*1024*1024) # 可大概设置
        if not buffer:
            break
        count += buffer.count('
    ')
    print(count)
    file.close()
    

    再根据行数估算内存可读进多少数据,将原始数据进行划分为多少块?

    2.分块拆分文件

    import pandas as pd
    reader = pd.read_csv('data_csv.csv', sep=',', chunksize=2000000)
    for i, chunk in enumerate(reader):
        print(i, '  ', len(chunk))
        chunk.to_csv('./data/data_' + str(i) + '.csv', index=False)
    

    Python 路径加一点是当前路径,加两点是上一级路径。

    3.合并数据

    import pandas as pd
    df = [pd.read_csv('./data/data_' + str(i) + '.csv') for i in range(5)] # 列表推导式
    data = pd.concat(df, axis=0).reset_index(drop=True) # 合并
    data.head()
    data.tail()
    

    axis = 0 时,pd.concat 实现列对齐合并。

    4.分块读取文件

    import feather
    import pandas as pd
    
    filePath = r'data_csv.csv'
    
    def read_csv_feature(filePath):
        # 读取文件
        f = open(filePath, encoding='utf-8')
        reader = pd.read_csv(f, sep=',', iterator=True)
        loop = True
        chunkSize = 1000000
        chunks = []
        while loop:
            try:
                chunk = reader.get_chunk(chunkSize)
                chunks.append(chunk)
            except StopIteration:
                loop = False
                print('Iteration is END!!!')
        df = pd.concat(chunks, axis=0, ignore_index=True)
        f.close()
        return df 
    
    data = read_csv_feature(filePath)
    

    参考链接:pandas.read_csv——分块读取大文件

    参考链接:使用Pandas分块处理大文件

    参考链接:pandas使用chunksize分块处理大型csv文件

    参考链接:pandas.read_csv参数详解

    参考链接:Python chunk读取超大文件

    参考链接:利用feather快速处理大数据

  • 相关阅读:
    python-函数(下):递归、高阶函数
    Spring Hystrix 原理与使用详解
    Jmeter 添加kafka支持
    dnspod-sr 高性能DNS 服务器软件
    Jupyter精选资源合集
    spring 跨域CORS Filter
    TensorFlow 基础准备指导
    TortoiseGit SSH-key 免用户名密码验证
    node.js、npm 升级操作详解
    Maven -DskipTests和-Dmaven.test.skip=true的区别
  • 原文地址:https://www.cnblogs.com/hider/p/15263528.html
Copyright © 2020-2023  润新知