ExcelFile与pandas中的read_excel

时间:2014-10-20 20:51:18

标签: python excel pandas

我潜入大熊猫并进行实验。至于从Excel文件中读取数据。我想知道使用ExcelFile和read_excel之间的区别。两者似乎都有效(尽管语法略有不同,正如预期的那样),文档同时支持这两种语法。在这两种情况下,文档都描述了相同的方法:"将Excel表读入DataFrame"和#34;将Excel表读入pandas DataFrame"。 (documentation for read_excelfor excel_file

我在这里看到了使用其中任何一个的解答,没有解决差异。此外,Google搜索没有产生讨论此问题的结果。

WRT我的测试,这看起来相当于:

path = "test/dummydata.xlsx"
xl = pd.ExcelFile(path)
df = xl.parse("dummydata")  # sheet name

path = "test/dummydata.xlsx" 
df = pd.io.excel.read_excel(path, sheetname=0)

除了后者为我节省了一条线之外,两者之间是否存在差异,是否有理由使用其中任何一条?

谢谢!

3 个答案:

答案 0 :(得分:14)

除语法之外没有特别的区别。从技术上讲,<!DOCTYPE html> <meta http-equiv="Content-Type" content="text/html" ; charset="UTF-8"> <?xml version="1.0" encoding="UTF-8" standalone="no"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>1-1</title> <link href="../../css/Book.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="../../js/Book.js"></script> </head> <body id="x1" xml:lang="en-US"> <div class="buttons"> <button class="button" onclick="myFunction3()">bigger</button> <button class="button" onclick="myFunction4()">big</button> <button class="button" onclick="myFunction5()">normal</button> <button class="button" onclick="myFunction6()">small</button> <button class="button" onclick="myFunction7()">smaller</button> <button class="button" onclick="myFunction8()">fontWieght</button> </div> <div class="Basic-Text-Frame"> <p class="SubEnglish">lorem <b>this is bold</b> ipsum lorem ipsum <b> this is also bold </b>ipsum lorem ipsumlorem ipsum lorem ipsum lorem ipsum lorem ipsum.</p> <h4 class="SmallEnglish"><b class="char-style-override-4">d.</b> lorem ipsum lorem ipsum lorem ipsum lorem ipsm lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum.</h4> <p class="SubEnglish"><span class="Normal char-style-override-4">lorem ipsum lorem ipsum lorem ipsum lorem im lorem psum lorem ipsum lorem ipsum lorem ipsum.</span></p> <h1 id="toc_marker-1" class="Latin"><span class="char-style-override-3">I. </span>lorem ipsum<span class="char-style-override-3"></span></h1> <h2 id="toc_marker-1-1" class="English">A. lorem ipsum lorem ipsum lorem ipsum (active pharmaceutical ingredient<span> </span>(API))</h2> <h3 class="Num"><b class="char-style-override-4">1.</b> lorem ipsum<b class="char-style-override-4"> This is bold</b> lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsumlorem ipsum lorem ipsumlorem ipsum.</h3> <h2 id="toc_marker-1-3" class="English">C. lorem ipsum lorem ipsum lorem ipsumlorem ipsum lorem ipsum</h2> </div> </body> </html>是一个类,ExcelFile是一个函数。在任何一种情况下,实际解析都由read_excel中定义的_parse_excel方法处理。

在早期版本的pandas中,read_excel完全由一个语句组成(注释除外):

ExcelFile

ExcelFile.parse除了致电return ExcelFile(path_or_buf,kind=kind).parse(sheetname=sheetname, kind=kind, **kwds) 外,并没有做更多的事情。

在最新版本的pandas中,read_excel确保它有一个ExcelFile._parse_excel对象(如果它没有,则创建一个),然后直接调用ExcelFile方法:

_parse_excel

并且通过更新(和统一)参数处理,ExcelFile.parse实际上只是单个语句:

if not isinstance(io, ExcelFile):
    io = ExcelFile(io, engine=engine)

return io._parse_excel(...)

这就是return self._parse_excel(...) 的文档现在说

的原因
相当于read_excel(ExcelFile,...)有关接受的参数的更多信息,请参阅read_excel docstring

至于声称ExcelFile.parse在循环中速度更快的another answer,这实际上只取决于您是否每次都从头开始创建ExcelFile.parse对象。您当然可以在循环外创建ExcelFile一次,然后将 传递给循环中的ExcelFile

read_excel

这相当于

xl = pd.ExcelFile(path)
for name in xl.sheet_names:
    df = pd.read_excel(xl, name)

如果您的循环涉及不同的路径(换句话说,您正在阅读许多不同的工作簿,而不只是单个工作簿中的多个工作表),那么您就无法创建无论如何,每个路径都有一个全新的xl = pd.ExcelFile(path) for name in xl.sheet_names: df = xl.parse(name) 个实例,然后再次ExcelFileExcelFile.parse将是等效的(同样慢)。

答案 1 :(得分:10)

ExcelFile.parse更快。

假设您正在循环中读取数据帧。 使用ExcelFile.parse,您只需传递Excelfile对象(xl)。所以excel表只加载一次,你用它来获取你的数据帧。 如果是Read_Excel,则传递路径而不是Excelfile对象。所以基本上每次再次加载工作簿。如果您的工作簿有大量的工作表和数万行,那么会弄得一团糟。

答案 2 :(得分:4)

我相信Pandas首次实现excel使用了两步流程,但随后添加了一步称为read_excel的流程。可能会留下第一个,因为人们已经在使用它了