如何将 OpenDocument 电子表格转换为熊猫数据框架?

Python 库 可以读取 Excel 电子表格,并使用 pandas.read_excel(file)命令将其转换为 pandas.DataFrame。在引擎盖下,它使用的 第三集库的 不支持操作系统文件。

ODS 文件是否等效于 pandas.read_excel?如果没有,我怎样才能做同样的开放文档格式的电子表格(ODS 文件) ?LibreOffice 和 OpenOffice 使用 ODF。

61461 次浏览

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

另一个选择: 用 odfpy 读取 ODS。此模块接受 OpenDocument 电子表格作为输入,并返回一个列表,可以从该列表中创建 DataFrame。

在 Pandas (包括 xls 和 xlsx)中支持读取 Excel 文件,请参阅 Read _ excel命令。可以使用 OpenOffice 将电子表格保存为 xlsx。显然,转换也可以在命令行上自动完成,使用的是 转换为命令行参数

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

编辑: 幸运的是,下面的答案已经过时了,如果你能更新到最近的熊猫版本。 如果你仍然喜欢使用熊猫版本的数据,并且只在需要时才从 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 档案。

您可以使用以下模块阅读 Python 中的 ODF (Open Document Format .ods)文档:

  • Odfpy /< a href = “ https://github.com/marcoti83/read-ods-with-odfpy”rel = “ norefrer”> read-ods-with-odfpy
  • Ezodf
  • Pyexcel /< a href = “ https://github.com/pyexcel/pyexcel-ods”rel = “ noReferrer”> pyexcel-ods
  • Py-odftools
  • 单纯间谍

使用 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问题跟踪程序 https://github.com/pydata/pandas/issues/2311上已经请求了 ODF 电子表格(* . ods 文件)支持,但是还没有实现。

  • 在未完成的 PR9070中使用了 ezodf,以便在大熊猫中实施 ODF 支持。那个 PR 现在已经关闭了(请阅读 PR 以进行技术讨论) ,但是它仍然可以作为 这个 pandas fork 中的一个实验特性使用。

  • 还有一些粗暴的方法可以直接从 XML 代码(给你)中读取

下面是一个使用 Ezodf模块的快速而肮脏的黑客技术:

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

注:

  • 所有其他有用的参数,如 headerskiprowsindex_colparse_cols没有实现在这个函数-随时更新这个问题,如果你想实现他们
  • ezodf依赖于 lxml,请确保已经安装了它

如果你只有一些的话。ODS 文件读取,我会只是打开它在开放办公室,并保存为一个 Excel 文件。如果有很多文件,可以使用 Linux 中的 unoconv指令将。ODS 文件。以编程方式 xls (和 Bash 一起)

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

我和熊猫相处得很好。 选择单元格,然后从 excel 或 opendocument 复制。 在 python 中运行以下命令。

import pandas as pd
data = pd.read_clipboard()

熊猫会根据复制的细胞做好工作。

在很大程度上基于 Davidovitch 的答案(谢谢) ,我已经把一个 包裹放在一起,在一个。ODS 文件并返回一个 DataFrame。它不是 pandas本身的完整实现,比如他的 PR,但它提供了一个简单的 read_ods函数来完成这项工作。

你可以用 pip install pandas_ods_reader安装它。还可以指定文件是否包含标题行,并指定自定义列名。

这是本地熊猫0.25。只要你有 Odfpy安装(Conda 安装 odfpyPip 安装 odfpy)你可以做

pd.read_excel("the_document.ods", engine="odf")

一些回复指出,odfpy 或其他外部软件包需要获得这一功能,但请注意,在熊猫的最新版本(目前是1.1,2020年8月) ,有支持 ODS 格式的功能,如 pd。ExcelWriter ()和 pd.read _ excel ()。您只需指定适当的引擎“ odf”即可使用 OpenDocument 文件格式(。奥道夫。ODS.奥特)。

大熊猫现在支持。ODS 档案。您必须首先安装 odfpy 模块。然后就会像往常一样了。Xls 文件。

conda install -c conda-forge odfpy

那么

pd.read_excel('FILE_NAME.ods', engine='odf')