ExcelFile与pandas中的read_excel
我正在学习pandas,并在尝试从Excel文件中读取数据。我想知道使用ExcelFile和read_excel之间有什么区别。两者看起来都能正常工作(虽然语法上有些不同,这也是可以理解的),而且文档中都支持这两种方法。在这两种情况下,文档对这两种方法的描述是一样的:“将Excel表格读入DataFrame”和“将Excel表格读入pandas DataFrame”。(read_excel的文档,以及excel_file的文档)
我在StackOverflow上看到的回答使用了这两种方法,但没有解释它们之间的区别。而且,谷歌搜索也没有找到讨论这个问题的结果。
根据我的测试,这两种方法似乎是等效的:
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 个回答
我觉得Pandas最开始处理Excel文件是用两步走的方式,但后来又增加了一种叫做read_excel的一步走的方法。可能是因为很多人已经在用最开始的那种方法,所以才把它保留下来了。
ExcelFile.parse
更快。
假设你在一个循环中读取数据框(dataframe)。使用 ExcelFile.parse
时,你只需要传入 Excelfile
对象(在你的例子中是 xl
)。这样,Excel 表格只会加载一次,然后你就可以用它来获取你的数据框。
而如果使用 Read_Excel
,你需要传入文件路径,而不是 Excelfile
对象。这样每次都会重新加载工作簿。如果你的工作簿里有很多表格和成千上万的行,这样做就会很麻烦。
其实这两者之间没有太大的区别,主要就是语法上的不同。从技术上讲,ExcelFile
是一个类,而 read_excel
是一个函数。不过无论是哪种情况,真正处理解析的工作都是由 ExcelFile
里面的 _parse_excel
方法来完成的。
在早期版本的 pandas 中,read_excel
其实就只有一行代码(除了注释之外):
return ExcelFile(path_or_buf,kind=kind).parse(sheetname=sheetname,
kind=kind, **kwds)
而 ExcelFile.parse
也只是简单地调用了 ExcelFile._parse_excel
。
在最近的 pandas 版本中,read_excel
会确保它有一个 ExcelFile
对象(如果没有的话就会创建一个),然后直接调用 _parse_excel
方法:
if not isinstance(io, ExcelFile):
io = ExcelFile(io, engine=engine)
return io._parse_excel(...)
而且在更新后的参数处理方式下,ExcelFile.parse
其实也就变成了一行代码:
return self._parse_excel(...)
这就是为什么 ExcelFile.parse
的文档现在说:
等同于 read_excel(ExcelFile, ...) 有关接受参数的更多信息,请查看 read_excel 的文档
至于 另一个回答 说 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)
如果你的循环涉及到不同的 路径(也就是说,你在读取多个不同的工作簿,而不仅仅是同一个工作簿里的多个表),那么你还是得为每个路径创建一个全新的 ExcelFile
实例。这样一来,ExcelFile.parse
和 read_excel
也就没有区别(而且速度也一样慢)。