Как преобразовать таблицы OpenDocument в pandas DataFrame?
Библиотека Python pandas может читать Excel и преобразовать их в команду pandas.DataFrame
с помощью команды pandas.read_excel(file)
. Под капотом используется библиотека xlrd, которая не поддерживает ods.
Есть ли эквивалент pandas.read_excel
для файлов ods? Если нет, как я могу сделать то же самое для электронной таблицы Open Document Formatted (ods файл)? ODF используется LibreOffice и OpenOffice.
Ответы
Ответ 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")