ti-enxame.com

Como converter planilhas OpenDocument para um DataFrame pandas?

A biblioteca Python pandas pode ler planilhas do Excel e convertê-las em um comando pandas.DataFrame com pandas.read_Excel(file). Sob o capô, ele usa xlrd library que não suporta arquivos ods.

Existe um equivalente de pandas.read_Excel para arquivos ods? Se não, como posso fazer o mesmo para uma planilha aberta em documento (arquivo ods)? O ODF é usado pelo LibreOffice e pelo OpenOffice.

30
Lamps1829

Você pode ler documentos ODF (Open Document Format .ods) em Python usando os seguintes módulos:

Usando o ezodf, um conversor simples de ODS para DataFrame poderia ser assim:

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)

P.S.

  • Suporte de planilha ODF (arquivos * .ods) foi solicitado no rastreador de problemas pandas: https://github.com/pydata/pandas/issues/2311 , mas ainda não está implementado.

  • ezodf foi usado no inacabado PR9070 para implementar suporte a ODF em pandas. Esse PR está agora fechado (leia o PR para uma discussão técnica), mas ele ainda está disponível como um recurso experimental em thispandas fork.

  • existem também alguns métodos de força bruta para ler diretamente do código XML ( aqui )
12
davidovitch

Aqui está um hack rápido e sujo que usa ezodf module:

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()})

Teste:

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

NOTAS:  

  • todos os outros parâmetros úteis como header, skiprows, index_col, parse_cols não são implementados nesta função - sinta-se à vontade para atualizar esta questão se você quiser implementá-los
  • ezodf depende de lxml verifique se você o instalou
8
MaxU

Outra opção: read-ods-with-odfpy . Este módulo usa uma planilha OpenDocument como entrada e retorna uma lista, da qual um DataFrame pode ser criado.

3
Lamps1829

Parece que a resposta é Não! E eu iria caracterizar as ferramentas para ler em ODS ainda esfarrapadas. Se você está em POSIX, talvez a estratégia de exportar para xlsx em tempo real antes de usar Pandas 'Muito boas ferramentas de importação para o xlsx é uma opção:

unoconv -f xlsx -o tmp.xlsx myODSfile.ods 

No geral, meu código se parece com:

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']

Aqui fileOlderThan () é uma função (veja http://github.com/cpbl/cpblUtilities ) que retorna true se o tmp.xlsx não existir ou for mais antigo que o arquivo .ods. 

2
CPBL

Eu tive boa sorte com pandas read_clipboard. Selecionando células e copie do Excel ou opendocument. Em python, execute o seguinte.

import pandas as pd
data = pd.read_clipboard()

Os pandas farão um bom trabalho com base nas células copiadas.

1
Mike Adrion

Se você tiver apenas alguns arquivos .ods para ler, basta abri-lo no openoffice e salvá-lo como um arquivo do Excel. Se você tem muitos arquivos, você pode usar o comando unoconv no Linux para converter os arquivos .ods para .xls programaticamente ( com bash )

Então é muito fácil lê-lo com pd.read_Excel('filename.xls')

1
wordsforthewise

Há suporte para ler arquivos do Excel em Pandas (ambos xls e xlsx), consulte o comando read_Excel . Você pode usar o OpenOffice para salvar a planilha como xlsx. A conversão também pode ser feita automaticamente na linha de comando, aparentemente, usando o parâmetro de linha de comando convert-to .

Ler os dados do xlsx evita alguns dos problemas (formatos de data, formatos numéricos, unicode) que você pode encontrar quando converte em CSV primeiro.

0
Matthias Berth

Se possível, salve como CSV a partir do aplicativo de planilha e, em seguida, use pandas.read_csv(). IIRC, um arquivo de planilha 'ods', na verdade, é um arquivo XML que também contém algumas informações de formatação. Portanto, se for sobre dados tabulares, extraia esses dados brutos primeiro para um arquivo intermediário (neste caso, CSV), que você poderá analisar com outros programas, como Python/pandas.

0
Jan-Philip Gehrcke

Baseado fortemente na resposta de davidovitch (obrigado), eu juntei um package que lê um arquivo .ods e retorna um DataFrame. Não é uma implementação completa em pandas, como seu PR, mas fornece uma função read_ods simples que faz o trabalho.

Você pode instalá-lo com pip install pandas_ods_reader. Também é possível especificar se o arquivo contém uma linha de cabeçalho ou não e especificar nomes de coluna personalizados.

0
iuvbio