如何将OpenDocument电子表格转换为pandas DataFrame?

时间:2013-07-24 13:09:38

标签: python pandas libreoffice dataframe opendocument

Python库可以读取Excel电子表格,并使用pandas.DataFrame命令将它们转换为pandas.read_excel(file)。在引擎盖下,它使用xlrddoes not support ods文件。

ods文件是否等效pandas.read_excel?如果没有,我如何为Open Document Formatted电子表格(ods文件)做同样的事情? LibreOffice和OpenOffice使用ODF。

12 个答案:

答案 0 :(得分:13)

您可以使用以下模块在Python中阅读ODF(Open Document Format .ods)文档: odfpy / read-ods-with-odfpy ezodf pyexcel / pyexcel-ods PY-odftools simpleodspy 使用ezodf,一个简单的ODS-to-DataFrame转换器可能如下所示: 将pandas导入为pd 导入ezodf doc = ezodf.opendoc('some_odf_spreadsheet.ods') print(“电子表格包含%d张(。)”。%len(doc.sheets)) 对于doc.sheets中的工作表:     打印( “ - ” * 40)     print(“工作表名称:'%s'”%sheet.name)     print(“工作表大小:(rows =%d,cols =%d)”%(sheet.nrows(),sheet.ncols())) #将第一张表转换为pandas.DataFrame sheet = doc.sheets [0] df_dict = {} for i,在enumerate中输入(sheet.rows()):     #row是一个单元格列表     #假设标题位于第一行     如果我== 0:         #columns作为字典中的列表         df_dict = {cell.value:[]表示行中的单元格}         #field列标题的索引         col_index = {j:j的cell.value,枚举(row)中的单元格}         继续     对于j,枚举(行)中的单元格:         #use header而不是column index         df_dict [COL_INDEX [J]]。追加(cell.value) #并转换为DataFrame df = pd.DataFrame(df_dict) 附: 已经在pandas问题跟踪器上请求了ODF电子表格(* .ods文件)支持:https://github.com/pydata/pandas/issues/2311,但它仍未实现。 ezodf在未完成的PR9070中用于在熊猫中实现ODF支持。 PR现已关闭(请阅读PR以进行技术讨论),但它仍可作为此pandas前叉中的实验性功能使用。 还有一些暴力方法可以直接从XML代码中读取(这里)

答案 1 :(得分:8)

这是一个使用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确保已安装

答案 2 :(得分:3)

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

答案 3 :(得分:2)

似乎答案是否定的! 而且我将描述在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。

答案 4 :(得分:2)

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

然后用pd.read_excel('filename.xls')

读取它真的很容易

答案 5 :(得分:2)

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

Math.ceil(number/1000)*1000;

根据复制的单元格,熊猫会做得很好。

答案 6 :(得分:2)

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

答案 7 :(得分:1)

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

conda install -c conda-forge odfpyr

然后

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

在很大程度上基于davidovitch的回答(谢谢),我整理了一个{。{3}},它读取一个.ods文件并返回一个DataFrame。这并不是pandas本身的完整实现,例如他的PR,但是它提供了一个简单的read_ods函数来完成任务。

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

答案 11 :(得分:0)

这在0.25大熊猫中可用。只要安装了odfpy,您就可以做到

SELECT
    i.*
FROM
    intersections AS i
    INNER JOIN collisions AS c ON (
        ST_WITHIN(c.Location, i.Area)
    )