75

Python 库可以读取 Excel 电子表格并将其转换为pandas.DataFramewithpandas.read_excel(file)命令。在后台,它使用不支持ods 文件的xlrd库。

是否有等效pandas.read_excel于 ods 文件的文件?如果没有,我该如何对 Open Document Formatted 电子表格(ods 文件)执行相同操作?ODF 被 LibreOffice 和 OpenOffice 使用。

4

12 回答 12

70

这在 pandas 0.25 中原生可用。只要您安装了odfpyconda install odfpypip install odfpy),您就可以做到

pd.read_excel("the_document.ods", engine="odf")
于 2019-07-04T03:07:26.397 回答
18

.ods您可以使用以下模块在 Python中读取 ODF(开放文档格式)文档:

使用 ezodf,一个简单的 ODS-to-DataFrame 转换器可能如下所示:

import pandas as pd
import ezodf

doc = ezodf.opendoc('some_odf_spreadsheet.ods')

print("Spreadsheet contains %d sheet(s)." % len(doc.sheets))
for sheet in doc.sheets:
    print("-"*40)
    print("   Sheet name : '%s'" % sheet.name)
    print("Size of Sheet : (rows=%d, cols=%d)" % (sheet.nrows(), sheet.ncols()) )

# convert the first sheet to a pandas.DataFrame
sheet = doc.sheets[0]
df_dict = {}
for i, row in enumerate(sheet.rows()):
    # row is a list of cells
    # assume the header is on the first row
    if i == 0:
        # columns as lists in a dictionary
        df_dict = {cell.value:[] for cell in row}
        # create index for the column headers
        col_index = {j:cell.value for j, cell in enumerate(row)}
        continue
    for j, cell in enumerate(row):
        # use header instead of column index
        df_dict[col_index[j]].append(cell.value)
# and convert to a DataFrame
df = pd.DataFrame(df_dict)

附言

  • 已在pandas问题跟踪器上请求 ODF 电子表格(*.ods 文件)支持:https ://github.com/pydata/pandas/issues/2311 ,但仍未实现。

  • ezodf在未完成的PR9070中用于实现 pandas 中的 ODF 支持。该 PR 现已关闭(请阅读 PR 以进行技术讨论),但它仍可作为 pandas分叉中的实验性功能使用。

  • 还有一些蛮力方法可以直接从 XML 代码中读取(这里
于 2016-03-23T14:21:53.150 回答
11

这是一个使用ezodf模块的快速而肮脏的 hack:

import pandas as pd
import ezodf

def read_ods(filename, sheet_no=0, header=0):
    tab = ezodf.opendoc(filename=filename).sheets[sheet_no]
    return pd.DataFrame({col[header].value:[x.value for x in col[header+1:]]
                         for col in tab.columns()})

测试:

In [92]: df = read_ods(filename='fn.ods')

In [93]: df
Out[93]:
     a    b    c
0  1.0  2.0  3.0
1  4.0  5.0  6.0
2  7.0  8.0  9.0

笔记:

  • 所有其他有用的参数,如header, skiprows, index_col,parse_cols都没有在这个函数中实现 - 如果你想实现它们,请随时更新这个问题
  • ezodf取决于lxml确保您已安装它
于 2017-02-19T18:16:10.203 回答
5

编辑:很高兴,如果您可以更新到最新的 Pandas 版本,下面的这个答案现在已经过时了。如果您仍想使用 Pandas 版本的数据工作,并且仅在需要时从 ODS 更新它,请继续阅读。


似乎答案是否定的!我会描述在 ODS 中阅读的工具仍然参差不齐。如果您使用的是 POSIX,那么在使用 Pandas 非常好的 xlsx 导入工具之前,可以选择即时导出到 xlsx 的策略:

unoconv -f xlsx -o tmp.xlsx myODSfile.ods 

总而言之,我的代码如下所示:

import pandas as pd
import os
if fileOlderThan('tmp.xlsx','myODSfile.ods'):
    os.system('unoconv -f xlsx -o tmp.xlsx myODSfile.ods ')
xl_file = pd.ExcelFile('tmp.xlsx')
dfs = {sheet_name: xl_file.parse(sheet_name) 
          for sheet_name in xl_file.sheet_names}
df=dfs['Sheet1']

这里的 fileOlderThan() 是一个函数(参见http://github.com/cpbl/cpblUtilities),如果 tmp.xlsx 不存在或比 .ods 文件旧,则返回 true。

于 2015-03-07T20:56:52.177 回答
3

另一种选择:read-ods-with-odfpy。该模块将 OpenDocument 电子表格作为输入,并返回一个列表,从中可以创建一个 DataFrame。

于 2013-07-24T17:42:06.367 回答
3

如果您只有几个 .ods 文件要阅读,我会在 openoffice 中打开它并将其保存为 excel 文件。如果您有很多文件,您可以使用 Linux 中的unoconv命令以编程方式将 .ods 文件转换为 .xls(使用 bash

然后它真的很容易阅读pd.read_excel('filename.xls')

于 2017-08-01T19:51:42.430 回答
3

pandas 现在支持 .ods 文件。您必须先安装 odfpy 模块。然后它将像普通的 .xls 文件一样工作。

conda install -c conda-forge odfpyr

然后

pd.read_excel('FILE_NAME.ods', engine='odf')
于 2021-01-09T17:39:22.557 回答
2

一些回应指出,需要 odfpy 或其他外部包来获得此功能,但请注意,在 Pandas 的最新版本(当前为 1.1,2020 年 8 月)中,诸如 pd.ExcelWriter() 和pd.read_excel()。您只需要指定合适的引擎“odf”即可使用 OpenDocument 文件格式(.odf、.ods、.odt)。

于 2020-08-02T22:29:48.540 回答
2

我对 pandas read_clipboard 很幸运。选择单元格,然后从 excel 或 opendocument 复制。在 python 中运行以下命令。

import pandas as pd
data = pd.read_clipboard()

Pandas 会根据复制的单元格做好工作。

于 2018-08-24T03:58:50.497 回答
1

根据 davidovitch 的回答(谢谢),我整理了一个读取 .ods 文件并返回 DataFrame 的包它本身并不是一个完整的实现pandas,比如他的 PR,但它提供了一个简单的read_ods函数来完成这项工作。

您可以使用pip install pandas_ods_reader. 也可以指定文件是否包含标题行,并指定自定义列名。

于 2019-01-31T22:41:57.523 回答
0

Pandas 支持读取 Excel 文件(xls 和 xlsx),请参阅read_excel命令。您可以使用 OpenOffice 将电子表格保存为 xlsx。转换也可以在命令行上自动完成,显然,使用convert-to 命令行参数

从 xlsx 读取数据可以避免在首先转换为 CSV 时可能遇到的一些问题(日期格式、数字格式、unicode)。

于 2015-01-09T16:37:28.520 回答
-1

如果可能,从电子表格应用程序另存为 CSV,然后使用pandas.read_csv(). IIRC,“ods”电子表格文件实际上是一个 XML 文件,其中还包含相当多的格式信息。因此,如果是关于表格数据,请先将这些原始数据提取到一个中间文件(在本例中为 CSV),然后您可以使用其他程序(例如 Python/pandas)对其进行解析。

于 2013-07-24T13:33:18.777 回答