python pandas libreoffice dataframe opendocument

python - ¿Cómo convertir las hojas de cálculo de OpenDocument a un DataFrame de pandas?



libreoffice (7)

Aquí hay un truco rápido y sucio que utiliza el módulo 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()})

Prueba:

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 los otros parámetros útiles como header , skiprows , index_col , parse_cols NO se implementan en esta función. No dude en actualizar esta pregunta si desea implementarlos.
  • ezodf depende de lxml asegúrese de tenerlo instalado

Los pandas biblioteca de Python pueden leer hojas de cálculo de Excel y convertirlas a pandas.DataFrame con el pandas.read_excel(file) . Debajo del capó, usa la biblioteca xlrd que no admite archivos ods.

¿Hay un equivalente de pandas.read_excel para archivos ods? De lo contrario, ¿cómo puedo hacer lo mismo para una hoja de cálculo con formato de documento abierto (archivo ods)? ODF es utilizado por LibreOffice y OpenOffice.


Existe soporte para leer archivos de Excel en pandas (tanto xls como xlsx), consulte el comando read_excel . Puede usar OpenOffice para guardar la hoja de cálculo como xlsx. La conversión también se puede hacer automáticamente en la línea de comando, al parecer, usando el parámetro de línea de comando de conversión a .

Leer los datos de xlsx evita algunos de los problemas (formatos de fecha, formatos de número, Unicode) con los que te puedes encontrar cuando conviertes primero a CSV.


Otra opción: read-ods-with-odfpy . Este módulo toma una hoja de cálculo de OpenDocument como entrada, y devuelve una lista, fuera de la cual se puede crear un DataFrame.


Parece que la respuesta es ¡No! Y caracterizaría las herramientas para leer en ODS aún desiguales. Si está en POSIX, tal vez la estrategia de exportar a xlsx sobre la marcha antes de usar las herramientas de importación muy buenas de Pandas para xlsx sea una opción:

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

En conjunto, mi código se ve así:

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

Aquí fileOlderThan () es una función (vea http://github.com/cpbl/cpblUtilities ) que devuelve verdadero si tmp.xlsx no existe o es anterior al archivo .ods.


Puede leer documentos ODF (Open Document Format .ods ) en Python usando los siguientes módulos:

Usando ezodf, un convertidor simple de ODS a DataFrame podría verse así:

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)

PD

  • Se ha solicitado el soporte de hojas de cálculo ODF (* .ods) en el rastreador de problemas de pandas : https://github.com/pydata/pandas/issues/2311 , pero aún no está implementado.

  • Se usó ezodf en el PR9070 inacabado para implementar el soporte ODF en pandas. Ese PR ahora está cerrado (lea el RP para una discusión técnica), pero todavía está disponible como una característica experimental en this tenedor pandas .

  • también hay algunos métodos de fuerza bruta para leer directamente del código XML ( here )

Si es posible, guarde como CSV de la aplicación de hoja de cálculo y luego use pandas.read_csv() . IIRC, un archivo de hoja de cálculo ''ods'' en realidad es un archivo XML que también contiene bastante información de formato. Entonces, si se trata de datos tabulares, extraiga primero estos datos sin procesar en un archivo intermedio (CSV, en este caso), que luego puede analizar con otros programas, como Python / pandas.


Si solo tiene unos pocos archivos .ods para leer, simplemente lo abriría en OpenOffice y lo guardaría como un archivo de Excel. Si tiene muchos archivos, podría usar el comando unoconv en Linux para convertir los archivos .ods a .xls programáticamente ( con bash )

Entonces es muy fácil leerlo con pd.read_excel(''filename.xls'')