专栏首页Hank’s Blog使用Pandas读取大型Excel文件

使用Pandas读取大型Excel文件

import os
import pandas as pd

HERE = os.path.abspath(os.path.dirname(__file__))
DATA_DIR = os.path.abspath(os.path.join(HERE, '..', 'data'))

def make_df_from_excel(file_name, nrows):
    """Read from an Excel file in chunks and make a single DataFrame.
    Parameters
    ----------
    file_name : str
    nrows : int
        Number of rows to read at a time. These Excel files are too big,
        so we can't read all rows in one go.
    """
    file_path = os.path.abspath(os.path.join(DATA_DIR, file_name))
    xl = pd.ExcelFile(file_path)

    # In this case, there was only a single Worksheet in the Workbook.
    sheetname = xl.sheet_names[0]

    # Read the header outside of the loop, so all chunk reads are
    # consistent across all loop iterations.
    df_header = pd.read_excel(file_path, sheetname=sheetname, nrows=1)
    # print(f"Excel file: {file_name} (worksheet: {sheetname})")
    print(f"文件名:{file_name}")
    print(f"工作表:{sheetname}")

    chunks = []
    i_chunk = 0
    # The first row is the header. We have already read it, so we skip it.
    skiprows = 1
    while True:
        df_chunk = pd.read_excel(
            file_path, sheetname=sheetname,
            nrows=nrows, skiprows=skiprows, header=None)
        skiprows += nrows
        # When there is no data, we know we can break out of the loop.
        if not df_chunk.shape[0]:
            break
        else:
            # print(f"  - chunk {i_chunk} ({df_chunk.shape[0]} rows)")
            print(f"行数:{df_chunk.shape[0]}")
            chunks.append(df_chunk)
        i_chunk += 1

    df_chunks = pd.concat(chunks)
    # Rename the columns to concatenate the chunks with the header.
    columns = {i: col for i, col in enumerate(df_header.columns.tolist())}
    df_chunks.rename(columns=columns, inplace=True)
    df = pd.concat([df_header, df_chunks])
    return df

if __name__ == '__main__':
    df = make_df_from_excel('/Users/mac/Desktop/Data/demo.xlsx', nrows=1000000)

from: cnblogs.com/everfight/p/pandas_read_large_number.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 18.scrapy_maitian_analysis

    hankleo
  • 使用requests模块post payload请求

    hankleo
  • python requests提示警告InsecureRequestWarning

    hankleo
  • python3 配置logging日志类的操作

    Python的logging功能是比较丰富的支持不同层次的日志输出,但或是我们想在日志前输出时间、或是我们想要将日志输入到文件,我们还是想要自定义日志类。

    砸漏
  • Ajax上传图片以及上传之前先预览

    手头上有几个小项目用到了easyUI,一开始决定使用easyUI就注定了项目整体上前后端分离,基本上所有的请求都采用Ajax来完成。在文件上传的时候用到了Aja...

    江南一点雨
  • C/C++中peek函数的原理及应用

    C++中的peek函数   该调用形式为cin.peek() 其返回值是一个char型的字符,其返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,...

    Angel_Kitty
  • 【DB笔试面试842】在Oracle中,如何启动Oracle数据库的监听日志?

    Oracle监听器是一个服务器端程序,用于监听所有来自客户端的请求,并为其提供数据库服务。监听器日志有如下特性:

    小麦苗DBA宝典
  • 递归优化

    那篇并编程艺术3写完了,但下午发现了原创度更高的个人真实案例分析,反正已经写完了,随时可以发,个人问题的优化记忆才更深。

    疯狂的KK
  • 从 PageRank Example 谈 Spark 应用程序调优

    在做PageRank测试时,发现有很多有趣的调优点,想到这些调优点可能对用户来说是普遍有效的,现把它整理出来一一分析,以供大家参考。

    涂小刚
  • salesforce lightning零基础学习(十四) Toast 浅入浅出

    https://developer.salesforce.com/docs/component-library/bundle/force:showToast/s...

    用户1169343

扫码关注云+社区

领取腾讯云代金券