当前位置: 首页 > 面试题库 >

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

公冶鸣
2023-03-14
问题内容

我只想从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)

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

如何只读取第一行?


问题答案:

由于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>


 类似资料:
  • 问题内容: 我想将包含字符串的巨大文件合并为一个文件,并尝试使用nio2。我不想将整个文件加载到内存中,因此我尝试了BufferedReader: 我对此进行了尝试,但是,它的工作原理,字符串的格式(例如,新行等未复制到合并文件中): 如何在不将整个文件加载到内存的情况下将大型文件与NIO2合并? 问题答案: 如果您想有效地合并两个或多个文件,则应问自己,为什么要使用基础文件并执行该任务。 通过使

  • 问题内容: 我需要逐行读取一个大文件。可以说该文件的大小超过5GB,我需要读取每一行,但是显然我不想使用它,因为它将在内存中创建一个非常大的列表。 下面的代码在这种情况下将如何工作?自身是否一一读取到内存中?是否需要生成器表达式? 另外,与命令一样,我该怎么做才能以相反的顺序阅读? 问题答案: 我提供此答案是因为Keith的提示虽然简洁,但并未明确关闭文件

  • 问题内容: 我有一堆.RData时间序列文件,想直接将它们加载到Python中,而无需先将文件转换为其他扩展名(例如.csv)。对实现此目标的最佳方法有何想法? 问题答案: 人们在R-help和R-dev列表上问这种事情,通常的答案是代码是文件格式的文档。因此,任何其他语言的任何其他实现都是 hard ++ 。 我认为唯一合理的方法是安装RPy2并从中使用R的功能,并随即转换为适当的python对

  • 各位, 我们有一个与excel更新的可伸缩性有关的需求。 例如,我们有一个Excel工作簿,有10个工作表,每个工作表都有大量的数据。 现在我们要做的是用“新值”替换其中一个单元格。 但是在Apache POI中,我们理解了我们必须加载整个“工作簿”,即使我们必须修改excel表单中的数据。这消耗了巨大的内存,是不可接受的。 是否有任何单元格级读写(立即刷新)工具或API用于Excel。

  • 问题内容: 我经常使用Scanner类来读取文件,因为它非常方便。 我的问题是,以上语句是否一次将整个文件加载到内存中?或者在fileScanner上进行后续调用,例如 从文件中读取(即从外部存储而不是从内存中读取)?我问是因为我担心如果文件太大而无法一次全部读入内存会发生什么。谢谢。 问题答案: 如果您阅读了源代码,则可以自己回答问题。 看来所讨论的Scanner构造函数的实现显示: 后者包装在

  • 我们使用Apache Camel来压缩和解压缩我们的文件。我们使用标准的和API。 我们的问题是,当我们得到非常大的文件(例如800MB到1GB以上的文件大小)时,我们的应用程序将耗尽内存,因为整个文件被加载到内存中进行压缩和解压缩。 是否有任何骆驼API或java库可以帮助压缩/解压缩文件,而不需要将整个文件加载到内存中。 这里还有一个类似的未解问题