Работа с текстовыми файлами в Python 3
Python – отличный инструмент для обработки данных. Вполне вероятно, что программа, которую вы пишете, будет управлять данными или выполнять операции чтения и записи. Потому особенно полезно знать, как Python обрабатывает различные форматы файлов, в которых хранятся разные типы данных.
Для примера представим программу Python, которая проверяет список пользователей для контроля доступа. Список пользователей, вероятно, будет храниться в текстовом файле. Ещё один пример: программа для выполнения финансового анализа получает вводные данные из сохраненной таблицы. Как видите, вне зависимости от приложения, входные и выходные данные задействованы практически всегда.
В данном руководстве речь идёт о типах форматов, которые поддерживает Python 3. Также руководство научит вас обрабатывать текстовые файлы.
Требования
Для выполнения руководства вам понадобится предварительно настроенная среда Python 3. Все необходимые инструкции вы найдёте в следующих статьях:
Форматы файлов в Python 3
Python очень гибкий и может относительно легко обрабатывать множество различных форматов файлов. Вот основные форматы:
| Формат | Описание |
| txt | Обычный текстовый файл, который хранит данные в виде символов (или строк) и исключает структурированные метаданные. |
| CSV | Файл, который хранит данные в виде таблицы; для структурирования хранимых данных используются запятые (или другие разделители). |
| HTML | Файл Hypertext Markup Language хранит структурированные данные; такие файлы используются большинством сайтов. |
| JSON | Простой файл JavaScript Object Notation, один из наиболее часто используемых форматов для хранения и передачи данных. |
Данное руководство рассматривает только формат txt.
1: Создание текстового файла
Сначала нужно создать тестовый файл для работы. Откройте текстовый редактор и создайте файл days.txt. Добавьте в новый файл список дней недели:
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Сохраните файл и запомните его местонахождение (это нужно для дальнейшей работы). В данном случае файл будет храниться в каталоге /users/8host/days.txt.
2: Открытие файла
Создайте сценарий files.py в текстовом редакторе и для простоты сохраните его в тот же каталог (/users/8host/).
Чтобы открыть файл в Python, нужно связать файл на диске с переменной Python. Сначала сообщите Python, где находится нужный файл. Чтобы открыть какой-либо файл, Python должен знать путь к этому файлу. Путь к файлу days.txt выглядит так: /users/8host/days.txt.
В файле files.py создайте переменную path и укажите в ней путь к файлу days.txt.
Теперь можно использовать функцию open(), чтобы открыть файл days.txt. В качестве первого аргумента функция open() требует путь к файлу, который нужно открыть. Эта функция имеет много других параметров. Одним из основных параметров является режим; это опциональная строка, которая позволяет выбрать режим открытия файла:
- ‘r’: открыть файл для чтения (опция по умолчанию).
- ‘w’: открыть файл для записи.
- ‘x’: создать новый файл и открыть его для записи.
- ‘a’: вставить в файл.
- ‘r+’: открыть файл для чтения и записи.
Попробуйте открыть файл для чтения. Для этого создайте переменную days_file и задайте в ней опцию open() и режим ‘r’, чтобы открыть файл days.txt только для чтения.
3: Чтение файла
Теперь вы можете работать с файлом. В зависимости от режима, в котором открыт файл, вы можете выполнить в нём те или иные действия. Для чтения информации Python предлагает три взаимосвязанные операции.
Первая операция – <file>.read(). Она возвращает все содержимое файла в виде одной строки.
Вторая операция – <file>.readline(), которая возвращает содержимое файла построчно.
Прочитав первую строку файла, операция readline при следующем запуске выведет вторую строку.
Третья операция – <file>.readlines(), она возвращает список строк, где строки представлены в виде отдельных элементов.
days_file.readlines()
[‘Monday\n’, ‘Tuesday\n’, ‘Wednesday\n’, ‘Thursday\n’, ‘Friday\n’, ‘Saturday\n’, ‘Sunday\n’]
Читая файлы в Python, важно помнить следующее: если файл был прочитан с помощью одной из операций чтения, его нельзя прочитать снова. К примеру, если вы запустили days_file.read(), а затем days_file.readlines(), вторая операция вернёт пустую строку. Потому нужно открывать новую переменную файла всякий раз, когда вы хотите прочитать данные из файла.
4: Запись в файл
Теперь попробуйте создать новый файл, который будет включать заголовок Days of the Week. Сначала создайте переменную title в файле files.py.
title = ‘Days of the Week\n’
Сохраните дни недели в строковой переменной days. Ниже показан код из всех вышеупомянутых разделов (чтобы было понятнее); файл открывается в режиме чтения, выходные данные операции чтения сохраняются в новой переменной days.
path = ‘/users/8host/days.txt’
days_file = open(path,’r’)
days = days_file.read()
В файле есть переменные для заголовка и содержимого файла days. Теперь можно записать данные в новый файл. Сначала укажите местонахождение файла (/users/8host/), затем – название нового файла (например, new_days.txt). Путь к новому файлу можно указать в переменной new_path. Чтобы открыть новый файл для записи, используйте функцию open() с параметром ‘w’.
new_path = ‘/users/8host/new_days.txt’
new_days = open(new_path,’w’)
Примечание: Если файл с таким именем (new_days.txt) уже существует, при открытии в режиме ‘w’ его содержимое пострадает.
Функция откроет файл, после чего вы можете записать в него данные с помощью операции <file>.write(). Операции записи необходим всего один параметр – строка, которую нужно записать в файл. Чтобы начать новую строку в файле, нужно явно использовать символ новой строки. Запишите в файл files.py заголовок и добавьте пару операторов print.
new_days.write(title)
print(title)
new_days.write(days)
print(days)
После этого нужно закрыть файл.
5: Закрытие файла
Операция закрытия файла прерывает соединение между файлом на диске и переменной. Закрытые файлы могут использоваться другими программами, кроме того, это обеспечивает безопасность данных. закрыть файл можно с помощью функции <file>.close(). Добавьте в файл files.py:
6: Проверка кода
Прежде чем запустить сценарий files.py, убедитесь, что его содержимое выглядит так:
path = ‘/users/8host/days.txt’
days_file = open(path,’r’)
days = days_file.read()
new_path = ‘/users/8host/new_days.txt’
new_days = open(new_path,’w’)
title = ‘Days of the Week\n’
new_days.write(title)
print(title)
new_days.write(days)
print(days)
days_file.close()
new_days.close()
Сохраните код, откройте терминал и запустите сценарий Python:
В терминале появится вывод:
Days of the Week
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Теперь попробуйте открыть файл new_days.txt. Если всё работает должным образом, файл будет выглядеть так:
Days of the Week
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Заключение
Теперь вы умеете обрабатывать и управлять простыми текстовыми файлами в Python 3: открывать и читать файлы, записывать в них новые данные и закрывать их.
Работа с файлами в Питоне

Работа с файлами в Питоне представлена широким набором возможностей. Имеются как встроенные инструменты, так и сторонние модули и библиотеки, позволяющие открывать и читать документы, а также записывать в них любую информацию.
Python умеет взаимодействовать со следующими форматами файлов: txt, jpg, csv, json, html, xlsx, pdf и целым рядом других. Удобство заключается в том, что для каждого случая есть отдельный модуль, ускоряющий разработку.
В данной статье в формате «how to» рассмотрим основной инструментарий для осуществления работы с документами различных типов в Python.
Виртуальная среда под проекты
Язык Python удобен тем, что может взаимодействовать с разными проектами при различных настройках. Как сказал создатель протокола BitTorrent Брэм Коен:
«Питон удобен своей простотой и удобным синтаксисом. Он позволяет инкапсулировать код, имеет широкую поддержку и опциональные параметры»
https://www.inspiringquotes.us/quotes/rHcs_LYZ8MvJh
Важно то, что инкапсуляция работает не только на уровне объектов и классов, но и в масштабах самого языка. Мы можем создавать проекты с отличающимися настройками, и они не будут друг другу «мешать».
Хорошей практикой считается активация виртуальной среды под конкретную проблему. Другими словами, устанавливать библиотеки нужно не глобально, для всей операционной системы, а для отдельного проекта. В этом помогает виртуальное окружение. Прежде чем переходить к написанию кода, нужно сформировать окружение проекта.
В Windows это делается следующим образом (в нужной папке открываем терминал и прописываем команды):
Вначале мы создаем папку виртуального окружения «.venv» (имя может быть любым), а затем активируем ее. Теперь все, что мы установим, будет связано только с данным проектом.
В UNIX-системах (Linux, MacOS) команды будут такими:
Открытие и чтение текстового файла
Для этого в Питоне имеются следующие конструкции:
- Функция open() – открывает документ в виде файлового объекта;
- Функция close() – закрывает файл и удаляет его из оперативной памяти;
- Контекстный менеджер with (автоматически очищает память после работы с файлом). Его синтаксис показан на рисунке ниже.
- Метод read() – считывает документ полностью или частично в виде строки;
- Метод readline() – построчно выводит содержимое объекта;
- Метод readlines() – формирует из строк файла список.
В папке проекта создадим текстовый документ «econ.txt» с таким наполнением:
Писать код будем в IDE PyCharm (среду разработки скачиваем с официального сайта).
Режимы работы с документом
Вторым параметром в функцию open() передается режим работы с файлом. Охарактеризуем их (таблица 1).
| Режим | Характеристика |
| r | Открыть для чтения |
| w | Открыть для записи (если такого документа не существует, то он будет создан) |
| a | Дописать новое содержимое в файл в дополнение к имеющемуся |
| x | Открыть для записи в несуществующий файл |
| t | Представить контент как текст |
| + | Открыть документ как для чтения, так и записи |
| b | Представить контент в виде байтов |
Таблица 1 – Режимы открытия файла
Если данный аргумент не передать, то файл по умолчанию будет отображаться в виде текста в режиме чтения. Кодировку указывать всегда обязательно, так как содержимое может предстать в виде нечитаемой «каши» символов.
Запись текстового контента в файл
Питон позволяет дозаписывать данные в документ или наполнить его новой информацией. В режиме «w» файл всегда будет перезаписываться полностью.
Запись текста возможна двумя способами:
- Через функцию write(),
- При помощи функции print().
Первая операция создает файл и записывает в него строчку «Python». Если он существует, то вызовется ошибка FileExistsError. Это своего рода защита от перезаписи.
Вторая операция добавит новую строку в документ. Теперь в нем будет две строки: «Python» и «is great».
В третьем случае старые данные из «somеtext.txt» удалятся, а вместо них будет внедрена новая строчка «Program».
Таким образом, если требуется дозаписывать информацию в файл, то используем режим «a», в противном случае ограничиваемся режимом «w».
Чтение и запись json-файлов
Для работы с json-объектами предусмотрен встроенный модуль json. Его нужно импортировать для начала.
Практически все объекты Питона можно безболезненно преобразовывать в json-сущности.
В библиотеке json имеется 4 основные функции (таблица 2).
| Функция | Характеристика |
| dumps() | Преобразовывает объекты Питона в json |
| dump() | Записывает преобразованные в json-формат данные в файл |
| loads() | Преобразовывает json-данные в словарь |
| load() | Считывает содержимое json-файла и делает из них словарь |
Таблица 2 – Ключевые функции модуля json
Так как мы рассматриваем тему создания и чтения файлов, то будем использовать соответствующие инструменты.
Создадим на ПК документ «my.json» с таким содержимым:
Теперь считаем их и представим в виде словаря Python.
Как видно, десериализация json-данных осуществляется следующим образом:
- Двойные кавычки преобразованы в одинарные;
- Булево значение false превратилось в False;
- Объект null соответствует значению None в Питоне.
А теперь расширим информацию в документе «my.json», добавив еще одного студента.
Открываем файл в режиме чтения и возможности записи («r+»). Считываем имеющееся в нем содержимое и преобразуем его в словарь. Добавляем новую запись в словарь с ключом «student2». Полностью переписываем содержимое документа с учетом новой информации: делаем отступы (indent=4) для удобства чтения, а также отключаем режим «только ASCII», чтобы появилась возможность вставлять кириллицу.
Запись excel-файлов
Для сохранения табличных данных удобнее всего пользоваться библиотекой csv, так как с этим форматом работать проще, он быстрее, может открываться без наличия Excel на рабочем компьютере.
Конечно, бывают ситуации, когда может потребоваться поработать именно с файлами формата «xlsx», для чего подойдет модуль openpyxl. Сначала установим данную библиотеку, так как она не встроена в Питон по умолчанию:
С ее помощью можно читать и записывать данные в «эксель»-файлы.
Основные инструменты, с которыми будем работать:
- Workbook() – класс для создания табличного файла;
- Create_sheet() – внедрение страницы с определенным именем;
- Save() – сохранение результата в файл;
- Cell() – запись информации в ячейку;
- Get_column_letter() – получение буквенного обозначения колонки.
В результате в созданном файле будем иметь следующее содержимое (рисунок 2).

Рисунок 2 – Результат наполнения xlsx-файла
Также вкладка получит название «Запись».
Файлы операционной системы
Встроенный модуль os позволяет просматривать содержимое каталогов и редактировать его.
Ознакомимся со следующими функциями:
- mkdir() – создание папки в выбранном каталоге;
- walk() – определение списка всех файлов и директорий внутри заданной и ее подпапках;
- remove() – удаление файла из системы;
- rename() – переименование документа и пр.
Приведем несколько примеров работы с библиотекой.
В результате работы программы в папке «temp» окажутся следующие файлы: ‘0.txt’, ‘2.txt’, ‘4.txt’, ‘5.txt’, ‘6.txt’, ‘первый.txt’.
Редактирование изображений в Питоне
Для работы с картинками используют внешний модуль Pillow. Он позволяет создавать и изменять рисунки, а также накладывать на них текст.
В первую очередь следует установить модуль:
Нарисуем квадрат красного цвета с длиной стороны 400 пикселей, применим к нему фильтр размытия, а затем сделаем его черно-белым.
Рисунок 3 – Красный квадрат
Рисунок 4 – Размытие картинки
Рисунок 5 – Преобразование в черно-белый цвет
Заключение
Мы рассмотрели лишь часть возможностей Питона по работе с файлами. Создание, считывание, вывод в файлы может осуществляться разными способами. Более того, практически все форматы и типы документов могут редактироваться при помощи Python. В зависимости от задачи найти нужный модуль не составит труда.
Ответы на вопросы читателей
Универсальный формат табличной информации – csv (Comma Separated Values, разделенные запятой данные). Его хорошо понимают разные сайты, среды разработки, операционные системы.
Чтобы взаимодействовать с excel-файлами требуется установить модуль openpyxl.
Для работы с Гугл-таблицами нужно получить доступ к программному интерфейсу в качестве разработчика.
Информация на Интернет-ресурсах зачастую представлена в виде json-данных. Она очень напоминает словари (dictionaries) в Питоне. Именно поэтому работать с этим форматом очень удобно.
Он используется для передачи и получения информации между API сайтов и программ.
После создания файлового объекта его можно прочитать полностью и вывести на печать.
Создание/изменение документов MS Word на Python.
Модуль python-docx предназначен для создания и обновления файлов с расширением .docx — Microsoft Word. Этот модуль имеет одну зависимость: сторонний модуль lxml .
Установка модуля python-docx в виртуальное окружение.
Модуль python-docx размещен на PyPI, поэтому установка относительно проста.
Основы работы с файлами Microsoft Word на Python.
-
; ; ; ; ; ;
- Пользовательский стиль символов текста;
- Абзац содержит все форматирование на уровне блока, такое как — отступ, высота строки, табуляции и так далее.
- Форматирование на уровне символов, например полужирный и курсив, применяется на уровне прогона paragraph.add_run() . Все содержимое абзаца должно находиться в пределах цикла, но их может быть больше одного. Таким образом, для абзаца с полужирным словом посередине требуется три прогона: обычный, полужирный — содержащий слово, и еще один нормальный для текста после него.
- .bold : полужирный текст;
- .underline : подчеркнутый текст;
- .italic : курсивный (наклонный) текст;
- .strike : зачеркнутый текст.
Открытие/создание документа.
Первое, что вам понадобится, это документ, над которым вы будете работать. Самый простой способ:
При этом создается пустой документ, основанный на "шаблоне" по умолчанию. Другими словами, происходит примерно то же самое, когда пользователь нажимает на иконку в Microsoft Word "Новый документ" с использованием встроенных значений по умолчанию.
При этом шрифт документа и его размер по умолчанию для всего документа можно задать следующим образом:
Так же, можно открывать существующий документ Word и работать с ним при помощи модуля python-docx . Для этого, в конструктор класса Document() необходимо передать путь к существующему документу Microsoft Word.
Добавление заголовка документа.
В любом документе, основной текст делится на разделы, каждый из которых начинается с заголовка. Название таких разделов можно добавить методом Document.add_heading() :
По умолчанию, добавляется заголовок верхнего уровня, который отображается в Word как "Heading 1". Если нужен заголовок для подраздела, то просто указываем желаемый уровень в виде целого числа от 1 до 9:
Если указать level=0 , то будет добавлен текст с встроенным стилем титульной страницы. Такой стиль может быть полезен для заголовка относительно короткого документа без отдельной титульной страницы.
Так же, заголовки разделов можно добавлять методом document.add_paragraph().add_run() , с указанным размером шрифта.
Добавление абзаца.
Абзацы в Word имеют основополагающее значение. Они используются для добавления колонтитулов, основного текста, заголовков, элементов списков, картинок и т.д.
Смотрим самый простой способ добавить абзац/параграф:
Метод Document.add_paragraph() возвращает ссылку на только что добавленный абзац (объект Paragraph ). Абзац добавляется в конец документа. Эту ссылку можно использовать в качестве своеобразного "курсора" и например, вставить новый абзац прямо над ним:
Такое поведение позволяет вставить абзац в середину документа, это важно при изменении существующего документа, а не при его создании с нуля.
Ссылка на абзац, так же используется для его форматирования встроенными в MS Word стилями или для кастомного/пользовательского форматирования.
Пользовательское форматирование абзаца.
Форматирование абзацев происходит при помощи объекта ParagraphFormat .
Простой способ форматировать абзац/параграф:
Чтобы узнать, какие параметры абзаца еще можно настроить/изменить, смотрите материал "Объект ParagraphFormat "
Очень часто в коде, с возвращенной ссылкой (в данном случае p ) ничего делать не надо, следовательно нет смысла ее присваивать переменной.
Применение встроенного стиля в Microsoft Word к абзацу.
Стиль абзаца — это набор правил форматирования, который заранее определен в Microsoft Word, и храниться в редакторе в качестве переменной. По сути, стиль позволяет сразу применить к абзацу целый набор параметров форматирования.
Можно применить стиль абзаца, прямо при его создании:
В конкретном стиле 'List Bullet' , абзац отображается в виде маркера. Также можно применить стиль позже. Две строки, в коде ниже, эквивалентны примеру выше:
Стиль указывается с использованием его имени, в этом примере имя стиля — 'List' . Как правило, имя стиля точно такое, как оно отображается в пользовательском интерфейсе Word.
Обратите внимание, что можно установить встроенный стиль прямо на результат document.add_paragraph() , без использования возвращаемого объекта paragraph
Жирный, курсив и подчеркнутый текст в абзаце.
Разберемся, что происходит внутри абзаца:
Когда создается абзац методом Document.add_paragraph() , то передаваемый текст добавляется за один прогон Run . Пустой абзац/параграф можно создать, вызвав этот метод без аргументов. В этом случае, наполнить абзац текстом можно с помощью метода Paragraph.add_run() . Метод абзаца .add_run() можно вызывать несколько раз, тем самым добавляя информацию в конец данного абзаца:
В результате получается абзац, который выглядит так же, как абзац, созданный из одной строки. Если не смотреть на полученный XML, то не очевидно, где текст абзаца разбивается на части. Обратите внимание на конечный пробел в конце первой строки. Необходимо четко указывать, где появляются пробелы в начале и в конце прогона, иначе текст будет слитный (без пробелов). Они (пробелы) автоматически не вставляются между прогонами paragraph.add_run() . Метод paragraph.add_run() возвращает ссылку на объект прогона Run , которую можно использовать, если она нужна.
Объекты прогонов имеют следующие свойства, которые позволяют установить соответствующий стиль:
Получится текст, что то вроде этого: "Абзац содержит форматирование на уровне блока".
Обратите внимание, что можно установить полужирный или курсив прямо на результат paragraph.add_run() , без использования возвращаемого объекта прогона:
Передавать текст в метод Document.add_paragraph() не обязательно. Это может упростить код, если строить абзац из прогонов:
Пользовательское задание шрифта прогона.
Применение стилей Microsoft Word к символам текста (к прогону).
В дополнение к встроенным стилям абзаца, которые определяют группу параметров уровня абзаца, Microsoft Word имеет стили символов, которые определяют группу параметров уровня прогона paragraph.add_run() . Другими словами, можно думать о стиле текста как об указании шрифта, включая его имя, размер, цвет, полужирный, курсив и т. д.
Подобно стилям абзацев, стиль символов текста будет определен в документе, который открывается с помощью вызова Document() (см. Общие сведения о стилях).
Стиль символов можно указать при добавлении нового прогона:
Также можете применить стиль к прогону после его добавления. Этот код дает тот же результат, что и строки выше:
Как и в случае со стилем абзаца, имя стиля текста такое, как оно отображается в пользовательском интерфейсе Word.
Пользовательский стиль символов текста.
Добавление разрыва страницы.
При создании документа, время от времени нужно, чтобы следующий текст выводился на отдельной странице, даже если последняя не заполнена. Жесткий разрыв страницы можно сделать следующим образом:
Если вы обнаружите, что используете это очень часто, это, вероятно, знак того, что вы могли бы извлечь выгоду, лучше разбираясь в стилях абзацев. Одно свойство стиля абзаца, которое вы можете установить, — это разрыв страницы непосредственно перед каждым абзацем, имеющим этот стиль. Таким образом, вы можете установить заголовки определенного уровня, чтобы всегда начинать новую страницу. Подробнее о стилях позже. Они оказываются критически важными для получения максимальной отдачи от Word.
Жесткий разрыв страницы можно привязать к стилю абзаца, и затем применять его для определенных абзацев, которые должны начинаться с новой страницы. Так же можно установить жесткий разрыв на стиль заголовка определенного уровня, чтобы с него всегда начинать новую страницу. В общем, стили, оказываются критически важными для того, чтобы получить максимальную отдачу от модуля python-docx .
Добавление картинки в документ.
Microsoft Word позволяет разместить изображение в документе с помощью пункта меню "Вставить изображение". Вот как это сделать при помощи модуля python-docx :
В этом примере используется путь, по которому файл изображения загружается из локальной файловой системы. В качестве пути можно использовать файловый объект, по сути, любой объект, который действует как открытый файл. Такое поведение может быть полезно, если изображение извлекается из базы данных или передается по сети.
Размер изображения.
По умолчанию, изображение добавляется с исходными размерами, что часто не устраивает пользователя. Собственный размер рассчитывается как px/dpi . Таким образом, изображение размером 300×300 пикселей с разрешением 300 точек на дюйм появляется в квадрате размером один дюйм. Проблема в том, что большинство изображений не содержат свойства dpi , и по умолчанию оно равно 72 dpi. Следовательно, то же изображение будет иметь одну сторону, размером 4,167 дюйма, что означает половину страницы.
Чтобы получить изображение нужного размера, необходимо указывать его ширину или высоту в удобных единицах измерения, например, в миллиметрах или сантиметрах:
Если указать только одну из сторон, то модуль python-docx использует его для вычисления правильно масштабированного значения другой стороны изображения. Таким образом сохраняется соотношение сторон и изображение не выглядит растянутым.
Классы Mm() и Cm() предназначены для того, чтобы можно было указывать размеры в удобных единицах. Внутри python-docx используются английские метрические единицы, 914400 дюймов. Так что, если просто указать размер, что-то вроде width=2 , то получится очень маленькое изображение. Классы Mm() и Cm() импортируются из подпакета docx.shared . Эти классы можно использовать в арифметике, как если бы они были целыми числами. Так что выражение, width=Mm(38)/thing_count, работает нормально.
Чтение документов Microsoft Word.
В модуле python-docx , структура документа Microsoft Word представлена тремя различными типами данных. На самом верхнем уровне объект Document() представляет собой весь документ. Объект Document() содержит список объектов Paragraph() , которые представляют собой абзацы документа. Каждый из абзацев содержит список, состоящий из одного или нескольких объектов Run() , представляющих собой фрагменты текста с различными стилями форматирования.