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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (7)
  • 关注 (0)
  • 查看 (583)

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

ods文件中是否有相同的pandas.read_excel? 如果没有,我怎样才能做一个开放文档格式的电子表格(ods文件)? ODF由LibreOffice和OpenOffice使用。

提问于
用户回答回答于

如果只有几个.ods文件可以读取,我只需要在openoffice中打开它,并将其保存为excel文件。 如果你有很多文件,你可以在Linux中使用unoconv命令将.ods文件转换成.xls(用bash

然后使用pd.read_excel('filename.xls')读取它非常容易

用户回答回答于

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)

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没有在此函数中实现-

用户回答回答于

看来答案是否定的! 我将描述在ODS仍然不整齐的情况下阅读的工具。 如果你使用的是POSIX,那么在使用熊猫的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。

用户回答回答于

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

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

用户回答回答于

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

用户回答回答于

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

用户回答回答于

可以使用以下模块读取Python中的ODF(OpenDocumentFormat)文档:

使用ezodf,一个简单的ODS到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)

ODF电子表格(*)已要求对pandas问题跟踪器:https://github.com/pydata/pandas/issues/2311

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励