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
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模块的快速而肮脏的黑客:
测试:
注意:
header
、skiprows
、index_col
、parse_cols
,都没有在这个函数中实现-如果您想实现它们,请随时更新这个问题ezodf
取决于lxml
确保已安装这在熊猫0.25中是本地可用的。只要你安装了odfpy你就可以
您可以使用以下模块在Python中读取ODF(Open Document Format
.ods
)文档:使用ezodf,一个简单的ODS到DataFrame转换器可能如下所示:
p.S.
已在问题跟踪程序
pandas
上请求ODF电子表格(.ods文件)支持,但仍未实现。在未完成的PR9070中使用
ezodf
在pandas中实现ODF支持。这个PR现在已经关闭了(阅读PR进行技术讨论),但是它仍然可以作为thispandas
fork中的一个实验特性使用。相关问题 更多 >
编程相关推荐