使用Python逐块加载Excel文件,而不是将整个文件加载到内存

发布于 2021-01-29 14:56:46

我只想从Excel文件(xlsx)中读取10行,而不一次加载整个文件,因为这不能在我的一台计算机上完成(内存不足)。

我尝试使用

import xlrd
import pandas as pd
def open_file(path):
    xl = pd.ExcelFile(path)
    reader = xl.parse(chunksize=1000)
    for chunk in reader:
        print(chunk)

看来文件先被加载然后又被分成几部分。

如何只读取第一行?

关注者
0
被浏览
84
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    由于xlsx文件的性质(本质上是一堆xml压缩在一起的文件),您不能将文件戳到任意字节,而希望它成为您感兴趣的表中表格的第N行的开头。

    你能做的最好是用pandas.read_excelskiprows(从文件顶部跳过行)和skip_footer(从底部跳跃行)参数。但是,这将首先将整个文件加载到内存,然后仅解析所需的行。

    # if the file contains 300 rows, this will read the middle 100
    df = pd.read_excel('/path/excel.xlsx', skiprows=100, skip_footer=100,
                       names=['col_a', 'col_b'])
    

    请注意,您必须使用names参数手动设置标题,否则列名将是最后跳过的行。

    如果您希望使用csv它,那么这是一项简单的任务,因为csv文件是纯文本文件。

    但是 ,这是一个很大的 ,但是 ,如果你是真的绝望了,你可以提取相关片的xml从文件xlsx归档和解析。但是,这绝非易事。

    一个示例xml文件,代表具有一个2 X 3表格的工作表。该<v>标签表示该单元的值。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
        <dimension ref="A1:B3"/>
        <sheetViews>
            <sheetView tabSelected="1" workbookViewId="0">
                <selection activeCell="C10" sqref="C10"/>
            </sheetView>
        </sheetViews>
        <sheetFormatPr defaultColWidth="11" defaultRowHeight="14.25" x14ac:dyDescent="0.2"/>
        <sheetData>
            <row r="1" spans="1:2" ht="15.75" x14ac:dyDescent="0.2">
                <c r="A1" t="s">
                    <v>1</v>
                </c><c r="B1" s="1" t="s">
                    <v>0</v>
                </c>
            </row>
            <row r="2" spans="1:2" ht="15" x14ac:dyDescent="0.2">
                <c r="A2" s="2">
                    <v>1</v>
                </c><c r="B2" s="2">
                    <v>4</v>
                </c>
            </row>
            <row r="3" spans="1:2" ht="15" x14ac:dyDescent="0.2">
                <c r="A3" s="2">
                    <v>2</v>
                </c><c r="B3" s="2">
                    <v>5</v>
                </c>
            </row>
        </sheetData>
        <pageMargins left="0.75" right="0.75" top="1" bottom="1" header="0.5" footer="0.5"/>
    </worksheet>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看