Файлы к уроку:
Описание
В этом уроке мы извлечем таблицу из документа Microsoft Word docx и запишем ее в файл CSV.
Решение
Сначала импортируем функцию Document из модуля docx и модуль pandas.
# Импортируем модули
from docx import Document
import pandas as pd
Прочитаем документ и извлечем из него таблицы.
# Читаем документ, извлекаем из него таблицы
filename = 't1.docx'
document = Document(filename)
tables = document.tables
Создадим заготовку для HTML документа.
my_document = '''<!DOCTYPE html><html><head>
<title>Таблицы из файла ''' + filename + '''</title>
</head><body>'''
Преобразуем таблицу Word в HTML таблицу.
# Цикл по всем таблицам
for table_idx, table in enumerate(tables):
# Начало таблицы, тэг table
my_table = "<table class='word-table' id='" + filename + "-Table" + str(table_idx) + "'>"
# Цикл по каждому ряду
for row_idx, row in enumerate(table.rows):
# Добавляем тэг tr для ряда
my_row = "<tr>"
# Цикл по каждой ячейке в ряду
for cell in row.cells:
my_cell = ""
for paragraph in cell.paragraphs:
my_cell = my_cell + paragraph.text
if row_idx == 0:
my_row = my_row + "<th>"+my_cell+"</th>"
else:
my_row = my_row + "<td>"+my_cell+"</td>"
# Закочим ряд закрывающим тэгом /tr
my_row = my_row + "</tr>"
# Добавим строку к таблице
my_table = my_table + my_row
# Закончим таблицу закрывающим тэгом table
my_table = my_table + "</table>\n\n"
# Добавляем таблицу в наш HTML документ
my_document = my_document + my_table
# Завершаем HTML документ закрывающими тэгами
my_document = my_document + '</table></body></html>'
Запишем все, что получилось в HTML файл.
# Запишем переменную в html файл
with open("my_document.html", "w") as file:
file.write(my_document)
Прочитаем HTML с помощью pandas.
# Читаем HTML
table_html = pd.read_html(my_document,
header=1)
data = table_html[0]
Удалим лишние столбцы.
# Удаляем лишние столбцы
data = data.drop(['I', 'II', 'III', 'IV', 'В среднем за год'], 1)
Чистим столбец от лишних символов.
# Убираем лишние символы
data.index = data['Unnamed: 0'].astype(str).str[:4].astype(int)
data.index
Выполняем операцию Анпивот.
# Делаем анпивот
data = data.melt(id_vars='Unnamed: 0')
data.columns = ['Год', 'Месяц', 'Ср. номинальная начисленная зарплата']
Запишем результат в CSV.
# Записываем в csv
data.to_csv('salary.csv',
encoding='1251',
sep=';')
Примененные функции
- docx.Document
- enumerate
- open
- pandas.read_html
- pandas.DataFrame.drop
- pandas.DataFrame.astype
- pandas.DataFrame.melt
- pandas.DataFrame.to_csv