Сегодня сделаем полезное: напишем свой конвертер из простых текстовых файлов в формат Word. Сначала это будет что-то простое, потом будем улучшать в следующих сериях. При этом на компьютере можно обойтись вообще без Ворда — скрипт будет работать и без него.
Если вы ни разу не программировали на Python, почитайте сначала это:
Что делаем
Пишем скрипт, который будет брать текст из обычного текстового файла .txt и переводить его в формат Word, чтобы получился файл .docx. Для этого в скрипте напишем функцию, внутрь которой поместим контекстный менеджер. Он позволяет автоматически выделять и освобождать ресурсы для какой-то задачи. Это похоже на то, как если бы кто-то выключал за нас свет и воду, когда они не нужны.
Также сделаем всё по красоте: в разработке хороший тон — выносить повторяющиеся части кода в функции и классы, чтобы потом вызывать их одной строкой. А ещё это удобно: если понадобится что-то заменить, мы поправим одно место в скрипте, а не будем переписывать весь код.
Устанавливаем и импортируем библиотеку для работы с Word
Сначала научим Python работать с Word. Для этого устанавливаем библиотеку python-docx
строкой кода в терминале редактора:
pip install python-docx
Если вы пишете код в текстовом редакторе, библиотеку можно установить в командной строке вашей операционной системы:
Если работаете в среде разработки IDE, то же самое надо сделать в терминале редактора. Обычно он запускается отдельной кнопкой:
Нам нужна не вся библиотека, а только часть — модуль 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 был создан и в нём есть нужный текст:
Что можно улучшить
Сейчас у нас есть скрипт, который можно запустить в любом месте кода, просто вызвав функцию. Что ещё можно сделать:
- вынести код в отдельный класс со своими методами;
- добавить построчную обработку файла
- научить код добавлять в 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)