Создаём на Python скрипт, который делает из простого текстового файла .txt вордовский файл .docx
easy

Создаём на Python скрипт, который делает из простого текстового файла .txt вордовский файл .docx

Пишем свой конвертер текстовых файлов

Сегодня сделаем полезное: напишем свой конвертер из простых текстовых файлов в формат Word. Сначала это будет что-то простое, потом будем улучшать в следующих сериях. При этом на компьютере можно обойтись вообще без Ворда — скрипт будет работать и без него. 

Если вы ни разу не программировали на Python, почитайте сначала это:

Как установить Python на компьютер и начать на нём писать

Что делаем

Пишем скрипт, который будет брать текст из обычного текстового файла .txt и переводить его в формат Word, чтобы получился файл .docx. Для этого в скрипте напишем функцию, внутрь которой поместим контекстный менеджер. Он позволяет автоматически выделять и освобождать ресурсы для какой-то задачи. Это похоже на то, как если бы кто-то выключал за нас свет и воду, когда они не нужны. 

Также сделаем всё по красоте: в разработке хороший тон — выносить повторяющиеся части кода в функции и классы, чтобы потом вызывать их одной строкой. А ещё это удобно: если понадобится что-то заменить, мы поправим одно место в скрипте, а не будем переписывать весь код.

Устанавливаем и импортируем библиотеку для работы с Word

Сначала научим Python работать с Word. Для этого устанавливаем библиотеку python-docx строкой кода в терминале редактора:

pip install python-docx

Если вы пишете код в текстовом редакторе, библиотеку можно установить в командной строке вашей операционной системы:

Создаём на Python скрипт, который делает из простого текстового файла .txt вордовский файл .docx

Если работаете в среде разработки IDE, то же самое надо сделать в терминале редактора. Обычно он запускается отдельной кнопкой:

Создаём на Python скрипт, который делает из простого текстового файла .txt вордовский файл .docx

Нам нужна не вся библиотека, а только часть — модуль Document. Когда мы добавим его в наш скрипт, то сможем работать с .docx — создавать, изменять и сохранять файлы такого формата.

Добавим модуль и создадим документ Word:

# импортируем из библиотеки модуль для работы с Word

from docx import Document

# создаём новый документ Word

doc = Document()

Сейчас у нас есть переменная, в которой открыт файл. Но если запустить скрипт, сам файл пока нигде не появится, потому что мы его ещё не сохранили.

Создаём текстовый файл

Нам нужен какой-то текстовый документ, который мы будем переводить в другой формат. Создадим в папке проекта текстовый файл input.txt и запишем в него такое: 

Привет, КОД!

Мы записали в файл всего одну строку, но скрипту будет всё равно, сколько там текста. Он с одинаковой лёгкостью справится и с двумя словами, и с «Войной и миром».

Создаём контекстный менеджер

Чтобы прочесть текстовый файл, мы используем оператор open и контекстный менеджер with. Тогда Python откроет файл, сделает всё, что записано в контекстном менеджере, и сам закроет его.

Выглядит это так:

# создаём контекстный менеджер и открываем файл .txt для чтения

with open(input_file, 'r', encoding='utf-8') as txt_file:

Что здесь происходит:

  • input_file — это переменная, внутри которой будет храниться путь к текстовому файлу;
  • 'r' — пояснение, как именно мы будем работать с файлом, у нас это чтение (read);
  • encoding='utf-8' — кодировка для распознавания кириллицы. Для работы с латиницей такой параметр не нужен, потому что Python и так умеет с ней работать;
  • as txt_file означает, что теперь за текстовый файл отвечает переменная txt_file. Если нужно что-то делать с файлом, нужно обращаться к ней.

Если сейчас запустить этот код, он выдаст ошибку, потому что пока что не знает переменной input_file. Нам нужно создать её и присвоить ей путь к файлу. Если он лежит в той же папке, что и основной скрипт, достаточно прописать название в кавычках:

# указываем путь к файлу .txt

input_file = 'input.txt'

Если файл лежит где-то ещё, в переменной нужно написать полный путь. Это может выглядеть так: input_file = '/folder_1/folder_2/folder_3/input.txt'

Когда мы открыли input_file, мы можем прочесть текст и сохранить его в отдельную переменную. Для чтения понадобится метод read(), который можно вызвать при работе с файлами. Наш файл лежит в переменной txt_file, поэтому метод можно применить напрямую к ней, Python поймёт:

# создаём контекстный менеджер и открываем файл .txt для чтения

with open(input_file, 'r', encoding='utf-8') as txt_file:

   # создаём переменную text и сохраняем в неё всё, что есть в текстовом файле

   text = txt_file.read()

Теперь в переменной text лежит текст, который мы перенесём в документ Word. Осталось перенести текст в .docx и сохранить его.

Пишем логику работы с файлом Word

Все действия по работе с Word-файлом возможны только благодаря добавлению в проект библиотеки python-docx. Без неё Python бы нас не понял.

Мы уже создали файл для работы, когда добавили в скрипт такую строку: 

# создаём новый документ Word

doc = Document()

Документ .docx лежит в переменной doc, с ней мы и будем работать дальше.

Чтобы добавить абзац с текстом, понадобится метод .add_paragraph(). В скобках можно прямо написать любой текст в кавычках или переменную, в которой предварительно сохранён текст. У нас есть готовая переменная, поэтому укажем её:

# добавляем текст из файла .txt в документ Word

doc.add_paragraph(text)

Теперь файл нужно сохранить, чтобы он появился на жёстком диске и его можно было открыть. Сначала пишем путь и имя файла и сохраняем их в переменную output_word_file:

# имя для создаваемого файла Word

output_word_file = 'output.docx'

Теперь эту переменную можно передать в метод save:

# Сохраняем документ Word

doc.save(output_word_file)

После выполнения нашего скрипта мы получим файл output.docx. В нём будет текст из txt-файла, сохранённый в docx-файле. 

Сейчас код выглядит довольно неряшливо. Чтобы повторить эти же действия в другом месте, понадобится скопировать весь код. А если захотим дописать какие-то действия в контекстный менеджер, например создание таблицы, придётся менять код во всех местах. Поэтому мы вынесем всё это в отдельную функцию, чтобы вызывать её одной строкой и изменять только в одном месте.

Заворачиваем весь процесс в функцию

Вот что будет делать функция:

  • принимать два параметра: путь до текстового файла и путь до файла Word, который надо создать;
  • запускать контекстный менеджер, чтобы прочесть текстовый файл;
  • копировать текст из этого файла и сохранять в переменную text;
  • создавать документ Word;
  • вставлять в него текст из переменной text;
  • сохранять документ Word в указанном месте.

Так этот алгоритм будет выглядеть в коде:

# создаём функцию, которая работает с двумя переменными: input_file и output_file

def txt_to_word(input_file, output_file):

   # создаём контекстный менеджер и открываем файл .txt для чтения

   with open(input_file, 'r', encoding='utf-8') as txt_file:

       # создаём переменную text и сохраняем в неё всё, что есть в текстовом файле

       text = txt_file.read()

   # создаём новый документ Word

   doc = Document()

   # добавляем текст из файла .txt в документ Word

   doc.add_paragraph(text)

   # сохраняем документ Word

   doc.save(output_file)

Чтобы функция заработала при запуске, нужно указать аргументы, которые она будет брать и применять к ним написанный внутри неё код. У нас это два пути к файлам — текстовому и документу Word:

# указываем путь к файлу .txt

input_txt_file = 'input.txt'

# указываем путь к файлу .docx, который будет создан

output_word_file = 'output.docx'

Теперь запустим скрипт такой командой:

txt_to_word(input_txt_file, output_word_file)

Проверяем, что файл output.docx был создан и в нём есть нужный текст:

Создаём на Python скрипт, который делает из простого текстового файла .txt вордовский файл .docx

Что можно улучшить

Сейчас у нас есть скрипт, который можно запустить в любом месте кода, просто вызвав функцию. Что ещё можно сделать:

  • вынести код в отдельный класс со своими методами;
  • добавить построчную обработку файла
  • научить код добавлять в Word-файл заголовки, таблицы и изображения;
  • сделать так, чтобы функция проходилась по всем текстовым файлам в директории и переводила весь текст в .docx;
  • добавить обработку исключений, чтобы при попытке работы с файлами другого формата появлялась запись в логе ошибок;
  • вместо добавления пути к файлу вручную, реализовать поиск нужного файла на жёстком диске по названию;
  • сделать из функции декоратор.

Пожалуй, этим и займёмся в следующий раз. А пока накидайте в комментариях, что бы вы ещё хотели видеть в продолжении этого проекта.

# импортируем библиотеку для работы с Word

from docx import Document

# создаём функцию, которая работает с двумя переменными: input_file и output_file

def txt_to_word(input_file, output_file):

   # создаём контекстный менеджер и открываем файл .txt для чтения

   with open(input_file, 'r', encoding='utf-8') as txt_file:

       # создаём переменную text и сохраняем в неё всё, что есть в текстовом файле

       text = txt_file.read()

   # создаём новый документ Word

   doc = Document()

   # добавляем текст из файла .txt в документ Word

   doc.add_paragraph(text)

   # сохраняем документ Word

   doc.save(output_file)

# указываем путь к файлу .txt

input_txt_file = 'input.txt'

# указываем путь к файлу .docx, который будет создан

output_word_file = 'output.docx'

txt_to_word(input_txt_file, output_word_file)

Редактор:

Инна Долога

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
easy