• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Заметка Конвертируем файлы doc в docx с помощью Python

Темы, которые НЕ подходят по объему под префикс "Статья"
В статье «Конвертация файлов Word в PDF с помощью Python» я описал пример автоматизации, когда множество файлов Word, с помощью скрипта на Python, можно конвертировать в PDF. Но, я так же упоминал, что модуль, который используется для конвертации, не работает со старыми форматами файлов, а именно - с doc. Поэтому, для того, чтобы можно было их конвертировать в pdf, сначала нужно сохранить их в docx. Вроде бы логично, но не делать же это все вручную. Ведь файлов может быть достаточно много, а лень, она такая)

000.png

Оговорюсь, что сам скрипт не мой. Я его нашел на необъятных просторах stackoverflow.com и немного над ним поиздевался.


Что потребуется?

Для начала, операционная система Windows, а также установленный Microsoft Word. Но, думаю, что это не проблема. Ну, и установить модуль glob:

pip install glob

screenshot2.png


Скрипт конвертации

Вот, что в итоге у меня получилось:

Python:
from glob import glob
import re
import os
import win32com.client as win32
from win32com.client import constants


def save_as_docx(path):

    # Открываем Word
    try:
        word = win32.gencache.EnsureDispatch('Word.Application')
        doc = word.Documents.Open(path)
        doc.Activate()

        # Меняем расширение на .docx и добавляем в путь папку
        # для складывания конвертированных файлов
        new_file_abs = str(os.path.abspath(path)).split("\\")
        new_dir_abs = f"{new_file_abs[0]}\\{new_file_abs[1]}"
        new_file_abs = f"{new_file_abs[0]}\\{new_file_abs[1]}\\doc_convert\\{new_file_abs[2]}"
        new_file_abs = os.path.abspath(new_file_abs)
        if not os.path.isdir(f'{new_dir_abs}\\doc_convert'):
            os.mkdir(f'{new_dir_abs}\\doc_convert')
        new_file_abs = re.sub(r'\.\w+$', '.docx', new_file_abs)
        print(new_file_abs)

        # Сохраняем и закрываем
        word.ActiveDocument.SaveAs(new_file_abs, FileFormat=constants.wdFormatXMLDocument)
        doc.Close(False)
    except:
        return str(path).split("\\")[-1]


def path_doc(paths):
    dict_error_file = []
    for path in paths:
        err = save_as_docx(path)
        if err != None:
            dict_error_file.append(err)
    if len(dict_error_file) >= 1:
        print(f'\nНе конвертированные файлы (ошибка открытия - файл поврежден):\n{dict_error_file}')


def main():
    dirs = input(f'Введите путь к папке с файлами\n(пример: C:\\temp) >>> ')
    paths = glob(f'{dirs}\\*.doc', recursive=True)
    path_doc(paths)


if __name__ == "__main__":
    main()

А теперь, как он работает. Для начала пользователь вводит путь до папки, в которой лежат файлы формата doc. Модуль globs рекурсивно обходит все папки и подпапки на наличие в них файлов нужного формата и возвращает список. Далее, этот список передается в функцию def path_doc(paths), которая в цикле передает путь к файлу doc из списка в функцию конвертации. Иногда попадаются такие файлы, которые Word открыть для редактирования не может. А следовательно, они доступны для открытия только в безопасном режиме. Логично, что такой файл не может быть и сохранен. Поэтому функция конвертации, при ошибке открытия файла, возвращает его имя и оно добавляется в список, чтобы потом вывести сообщение о необработанных файлах.

Ну, а функция конвертации открывает документ, путь к которому был передан с помощью MS Word. Теперь нам нужно создать в папке с документами для конвертации папку, в которую будут складываться уже сконвертированные документы. Поэтому производятся манипуляции по разборке и сборке абсолютного пути к файлу. Затем создается папка для конвертируемых документов. Ну, а после, файлу с помощью функции re присваивается новое расширение, с путем для сохранения.

Далее файл сохраняется и, так как он был открыт, закрывается.

Таким образом, конвертация не занимает много времени. По крайней мере, это намного быстрее, чем вручную.

Надеюсь, что данный скрипт кому-то будет полезен. Спасибо за внимание
 
Последнее редактирование модератором:
  • Нравится
Реакции: Maksim_K и Mogen
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!