Доброго времени суток.
Пользуюсь библиотекой python-docx чтобы запарсить данные в таблицах из файлов .doc , .docx в папке.
Данные собираются в массив далее переформируются в словарь и сохраняются в excel.
В данный момент времени необходимо еще добавить в массив фразу из текста в документе например:
"2. Цены по Приложению № 1 действительны в случае поступления оплаты на расчётный счёт Продавца до 31 января 2022 года"
Необходимо дату "31 января 2022 года"
1. Оформленный код в студию.
2. Формат разбираемого текста фиксирован, т.е. он всегда выглядит одинаково? Если да, регулярные выражения в помощь.
Если нет... ну можешь попробовать задействовать пакет Natasha, но это из пушки по воробьям.
Спасибо большое) я уже сообразил. Если интересно вот код, я очень слаб в программировании, если найдете решения по оптимизации кода буду рад посмотреть варианты
import os
from docx import Document
import pandas as pd
parse_table_list = []
directory = 'D:\Новая папка'
data_base = pd.read_excel('D:\Новая папка\База данных.xlsx')
def parse_files(directory):
file_list = []
for filename in os.listdir(directory):
file = os.path.join(directory, filename)
if os.path.isfile(file) and filename.endswith('.docx') or filename.endswith('.doc'):
file_list.append(file)
for file in file_list:
parse_table_docx(file)
def parse_table_docx(file):
doc = Document(file)
all_tables = doc.tables
data_tables = {i:None for i in range(len(all_tables))}
indx = 0
list_paragraphs = []
find_text = 'действительны в случае поступления оплаты на расчётный счёт Продавца'
for para in doc.paragraphs:
indx += 1
if len(para.text) > 0:
list_paragraphs.append(para.text)
for i in range(len(list_paragraphs) - 1):
if find_text in list_paragraphs[i]:
date_indx = list_paragraphs[i].find(find_text)
date_in_text = list_paragraphs[i][date_indx + 69:len(list_paragraphs[i])-1]
for i, table in enumerate(all_tables):
data_tables[i] = [[] for _ in range(len(table.rows))]
for j, row in enumerate(table.rows):
for cell in row.cells:
data_tables[i][j].append(cell.text)
for i in data_tables:
if data_tables[i][0][0] == 'Наименование товара':
if data_tables[i][0][1] == 'Ед. изм.':
for k in range(len(data_tables[i])):
if k >= 1 and k < len(data_tables[i])-1:
for l in range(len(data_tables[i][k])):
if l < (len(data_tables[i][k])-1):
parse_table_list.append(data_tables[i][k][l])
parse_table_list.append(date_in_text)
def sorted_table(parse_table_list):
parse_table_list = {
'Наименование товара':[parse_table_list[i] for i in range(0, len(parse_table_list), 6)],
'Ед. изм.':[parse_table_list[i] for i in range(1, len(parse_table_list), 6)],
'Количество':[parse_table_list[i] for i in range(2, len(parse_table_list), 6)],
'Цена за 1 л, кг, п.е. в тенге':[parse_table_list[i] for i in range(3, len(parse_table_list), 6)],
'Общая сумма, в тенге':[parse_table_list[i] for i in range(4, len(parse_table_list), 6)],
'Оплата до': [parse_table_list[i] for i in range(5, len(parse_table_list), 6)],
}
return parse_table_list
parse_files(directory)
parse_table_list = sorted_table(parse_table_list)
parse_total = pd.DataFrame(parse_table_list)
output = parse_total.merge(data_base, left_on='Наименование товара', right_on='Наименования товара')
del output['Наименования товара']
companies = output['Наименование компании'].unique()
with pd.ExcelWriter('D:\Новая папка\Итог.xlsx') as writer:
for comp in companies:
cur = output[output['Наименование компании'] == comp]
del cur['Наименование компании']
cur.to_excel(writer, sheet_name=comp)
print('Готово')
ValueError: file 'D:\Новая папка\№40 КХ Егоровское.doc' is not a Word file, content type is 'application/vnd.openxmlformats-officedocument.themeManager+xml'