我想从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 :(得分:2)
由于xlsx
文件的性质(基本上是一堆压缩在一起的xml
文件),您无法将文件戳到任意字节,并希望它是您感兴趣的工作表中第N行的开头。
您可以做的最好的事情是使用pandas.read_excel
和skiprows
(跳过文件顶部的行)和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>
标记表示单元格&#39;值。
<?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>