Python 库pandas可以读取 Excel 电子表格并将其转换为pandas.DataFrame
withpandas.read_excel(file)
命令。在后台,它使用不支持ods 文件的xlrd库。
是否有等效pandas.read_excel
于 ods 文件的文件?如果没有,我该如何对 Open Document Formatted 电子表格(ods 文件)执行相同操作?ODF 被 LibreOffice 和 OpenOffice 使用。
这在 pandas 0.25 中原生可用。只要您安装了odfpy(conda install odfpy或pip install odfpy),您就可以做到
pd.read_excel("the_document.ods", engine="odf")
.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)
附言
这是一个使用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
确保您已安装它似乎答案是否定的!我会描述在 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。
另一种选择:read-ods-with-odfpy。该模块将 OpenDocument 电子表格作为输入,并返回一个列表,从中可以创建一个 DataFrame。
pandas 现在支持 .ods 文件。您必须先安装 odfpy 模块。然后它将像普通的 .xls 文件一样工作。
conda install -c conda-forge odfpyr
然后
pd.read_excel('FILE_NAME.ods', engine='odf')
一些回应指出,需要 odfpy 或其他外部包来获得此功能,但请注意,在 Pandas 的最新版本(当前为 1.1,2020 年 8 月)中,诸如 pd.ExcelWriter() 和pd.read_excel()。您只需要指定合适的引擎“odf”即可使用 OpenDocument 文件格式(.odf、.ods、.odt)。
我对 pandas read_clipboard 很幸运。选择单元格,然后从 excel 或 opendocument 复制。在 python 中运行以下命令。
import pandas as pd
data = pd.read_clipboard()
Pandas 会根据复制的单元格做好工作。
根据 davidovitch 的回答(谢谢),我整理了一个读取 .ods 文件并返回 DataFrame 的包。它本身并不是一个完整的实现pandas
,比如他的 PR,但它提供了一个简单的read_ods
函数来完成这项工作。
您可以使用pip install pandas_ods_reader
. 也可以指定文件是否包含标题行,并指定自定义列名。
Pandas 支持读取 Excel 文件(xls 和 xlsx),请参阅read_excel命令。您可以使用 OpenOffice 将电子表格保存为 xlsx。转换也可以在命令行上自动完成,显然,使用convert-to 命令行参数。
从 xlsx 读取数据可以避免在首先转换为 CSV 时可能遇到的一些问题(日期格式、数字格式、unicode)。
如果可能,从电子表格应用程序另存为 CSV,然后使用pandas.read_csv()
. IIRC,“ods”电子表格文件实际上是一个 XML 文件,其中还包含相当多的格式信息。因此,如果是关于表格数据,请先将这些原始数据提取到一个中间文件(在本例中为 CSV),然后您可以使用其他程序(例如 Python/pandas)对其进行解析。