Подтвердить что ты не робот

Как преобразовать таблицы OpenDocument в pandas DataFrame?

Библиотека Python может читать Excel и преобразовать их в команду pandas.DataFrame с помощью команды pandas.read_excel(file). Под капотом используется библиотека xlrd, которая не поддерживает ods.

Есть ли эквивалент pandas.read_excel для файлов ods? Если нет, как я могу сделать то же самое для электронной таблицы Open Document Formatted (ods файл)? ODF используется LibreOffice и OpenOffice.

4b9b3361

Ответ 1

Вы можете читать ODF (Open Document Format .ods) документы в Python, используя следующие модули:

Используя 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)

PS

  • Поддержка электронных таблиц ODF (*.ods) была запрошена на трекере проблем pandas: https://github.com/pydata/pandas/issues/2311, но она по-прежнему не реализована.

  • ezodf использовался в незавершенном PR9070 для реализации поддержки ODF в пандах. Этот PR в настоящее время закрыт (читайте PR для технического обсуждения), но он все еще доступен в качестве экспериментальной функции в этом pandas.

  • Есть также некоторые методы грубой силы для чтения непосредственно из кода XML (здесь)

Ответ 2

Вот быстрый и грязный хак, который использует модуль 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.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 убедитесь, что он установлен

Ответ 3

Другая опция: read-ods-with-odfpy. Этот модуль принимает в качестве входных данных таблицу OpenDocument и возвращает список, из которого может быть создан DataFrame.

Ответ 4

Кажется, ответ No! И я бы охарактеризовал инструменты для чтения в ODS, все еще оборванные. Если вы используете POSIX, возможно, стратегия экспорта в xlsx на лету перед использованием Pandas "очень приятные инструменты импорта для 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), которая возвращает true, если tmp.xlsx не существует или старше, чем .ods.

Ответ 5

Если у вас есть только несколько файлов .ods для чтения, я бы просто открыл его в openoffice и сохранил его как файл excel. Если у вас много файлов, вы можете использовать unoconv command в Linux для преобразования файлов .ods в .xls программно (с bash)

Тогда это действительно легко прочитать с помощью pd.read_excel('filename.xls')

Ответ 6

Мне повезло с пандами read_clipboard. Выделите ячейки, а затем скопируйте из Excel или Opendocument. В python запускаем следующее.

import pandas as pd
data = pd.read_clipboard()

Панды будут делать хорошую работу, основываясь на скопированных клетках.

Ответ 7

Если возможно, сохраните CSV из приложения электронной таблицы, а затем используйте pandas.read_csv(). IIRC, файл электронной таблицы "ods" на самом деле является XML файлом, который также содержит довольно некоторую информацию о форматировании. Таким образом, если это связано с табличными данными, сначала извлеките эти необработанные данные в промежуточный файл (в этом случае CSV), который затем можно проанализировать с другими программами, такими как Python/pandas.

Ответ 8

Существует поддержка чтения файлов Excel в Pandas (как xls, так и xlsx), см. команду read_excel. Вы можете использовать OpenOffice для сохранения таблицы как xlsx. Преобразование также может быть выполнено автоматически в командной строке, по-видимому, используя параметр для преобразования в командной строке.

Чтение данных из xlsx позволяет избежать некоторых проблем (форматов даты, форматов чисел, unicode), которые вы можете запустить, когда вы сначала конвертируете в CSV.

Ответ 9

Основываясь на ответе davidovitch (спасибо), я собрал пакет, который читает в файле .ods и возвращает DataFrame. Это не полная реализация в pandas сам, например, его PR, но он обеспечивает простой read_ods функцию, которая делает работу.

Вы можете установить его с помощью pip install pandas_ods_reader. Также можно указать, содержит ли файл строку заголовка или нет, а также указать настраиваемые имена столбцов.

Ответ 10

Это доступно изначально в пандах 0,25. Пока у вас установлен odfpy, вы можете делать

pd.read_excel("the_document.ods", engine="odf")