Как называется библиотека python предназначенная для работы с файлами в различных кодировках

Обновлено: 03.07.2024

Ввод/вывод текста, двоичных и необработанных потоков.

Модуль io предоставляет основные средства Python для работы с различными типами ввода-вывода. Существует три основных типа ввода-вывода: Text I/O - текстовый ввод-вывод, Binary I/O двоичный ввод-вывод и Raw I/O - необработанный ввод-вывод. Конкретный объект, принадлежащий любой из этих категорий, называется файловым объектом.

Независимо от своей категории каждый конкретный объект потока также будет иметь различные возможности: он может быть доступен только для чтения, только для записи или для чтения и записи. Он также может разрешать произвольный произвольный доступ (поиск вперед или назад в любом месте) или только последовательный доступ в случае сокета или канала.

Все потоки тщательно следят за типом данных, которые им предоставляются. Например, передача объекта str методу write() двоичного потока вызовет исключение TypeError . То же самое будет, если передать объект bytes методу write() текстового потока.

Содержание:

Text I/O - текстовый ввод-вывод:

Текстовый ввод/вывод ожидает и производит объекты типа str . Это означает, что каждый раз, когда хранилище изначально состоит из байтов, например в случае файла, кодирование и декодирование данных выполняется прозрачно, а также учитывается необязательный перевод специфичных для платформы символов новой строки.

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

Текстовые потоки в памяти также доступны в виде объектов io.StringIO :

API текстового потока подробно описан в документации по io.TextIOBase .

Binary I/O - двоичный ввод-вывод:

Двоичный ввод/вывод, также называемый буферизованным вводом/выводом ожидает объекты, похожие на байты, и создает объекты типа bytes . Кодирование, декодирование или перевод новой строки не выполняется. Эта категория потоков может использоваться для всех видов нетекстовых данных, а также когда требуется ручное управление обработкой текстовых данных.

Двоичные потоки в памяти также доступны в виде объектов io.BytesIO :

API двоичного потока подробно описан в документации по io.BufferedIOBase . Другие модули могут предоставлять дополнительные способы создания текстовых или двоичных потоков.

Raw I/O - необработанный ввод-вывод:

API необработанного потока подробно описан в документации по io.RawIOBase .

Кодировка текста.

Кодировка по умолчанию для io.TextIOWrapper и встроенной функции open() зависит от локали ( locale.getpreferredencoding (False)).

Многие разработчики не указывают кодировку при открытии текстовых файлов, закодированных в UTF-8 (например, JSON, TOML, Markdown и т. д.), так как в Unix по умолчанию используют локаль UTF-8. НО, для большинства пользователей Windows, это вызывает ошибки, так как кодировка локали не является UTF-8. Например:

Кроме того, хотя пока нет конкретного плана, Python может изменить кодировку текстового файла по умолчанию на UTF-8 в будущем.

Если нужно запустить существующий код в Windows, который пытается открыть файлы UTF-8 с использованием кодировки локали по умолчанию, то можно включить режим UTF-8.

Включение EncodingWarning .

Новое в Python 3.10

Чтобы найти, где в коде используется кодировка локали по умолчанию, можно включить параметр командной строки -X warn_default_encoding или установить переменную среды PYTHONWARNDEFAULTENCODING , которая будет выдавать предупреждение EncodingWarning при использовании кодировки по умолчанию.

Если код предоставляет API, который использует функцию open() или io.TextIOWrapper и при этом передает encoding=None в качестве аргумента, то можно использовать функцию io.text_encoding() , чтобы вызывающие API генерировали EncodingWarning , если они не передают кодировку.

Загрузить данные в программу из файла, выгрузить данные в файл, записывать историю обращений к программе в специальный файл — всё это очень частые задачи.

Как открыть файл

Чтобы открыть файл, используется функция open() :

  • Функция open() принимает на вход 2 аргумента: путь до файла и права, с которыми его открыть. r — от read , т.е. мы просим открыть файл в режиме чтения.
  • Функция open() возвращает не текст в файле, а сам файл. Файл как бы теперь открыт, как если вы бы щёлкнули по нему дважды левой клавишей.
  • Метод файла .read() позволяет читать данные из файла. Строка с содержимым файла запишется в переменную file_contents .
  • Метод .close закрывает файл.

Как сделать правильно

Закрывать файлы важно по двум причинам:

  1. Чтобы читать и писать в один и тот же файл из разных мест программы.
  2. Чтобы не превысить лимиты операционной системы. У неё есть ограничение на число одновременно открытых файлов. Ограничение легко превысить, если открывать файлы в цикле.

Однажды вы точно забудете закрыть файл. В Python есть специальная команда на такой случай — with :

Выглядит немного непривычно, но суть простая: всё, что лежит “внутри” блока with (т.е. с отступом от него) — делается с открытым файлом. Как только файл не нужен, вы убираете отступ и файл сам закроется.

Открыть файл в папке

Допустим, рядом c вашим файлом main.py , из которого вы запускаете код, лежит папка files . В этой папке лежит файл file.txt :

Вам очень нужно открыть файл file.txt , но он спрятался в папке, что же делать? Вот как его открыть:

Ошибки кодировки

Бывает, что вы знаете, что файл в порядке, но Python читает его со странными символами: ������. Дело в кодировках: одни программы пользуют CP1251, другие ASCII, третьи UTF-8. К сожалению, программистам до сих пор не получилось окончательно перейти к какому-то одному варианту.

Чтобы открыть файл с нужной кодировкой, нужно передать функции open именованный аргумент encoding :

Если вы не знаете кодировку вашего файла, на Хабре есть интересная статья с такой схемой:

Запись в файл

Для записи в файл нужно лишь указать режим w (write) и использовать не .read() , а .write() :

Альтернативные статьи

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте - для разных операций над строками.
Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в "стандарт". Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.

Использование

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

для того что-бы интерпретатор python понял в какой кодировке файл


Строки в скрипте
Строки в скрипте хранятся байтами, от кавычки до кавычки:

= 6 байт при cp1251
= 12 байт при utf8

Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в начале:

и если кодировка содержимого в файле отличается от указанной, то в строке могут быть "битые символы"


Загрузка и сохранение файла

Текст в скрипте

Процедуре print текст желательно передавать в рабочей кодировке либо кодировать в кодировку ОС.
Результат скрипта при запуске из консоли windows XP:

В последней строке print преобразовал unicode в cp866 автоматический, см. следующий пункт


Авто-преобразование кодировки
В некоторых случаях для упрощения разработки python делает преобразование кодировки, пример с методом print можно посмотреть в предыдущем пункте.
В примере ниже, python сам переводит utf8 в unicode - приводит к одной кодировке для того что-бы сложить строки.

Как видим результирующая строка "c" в unicode. Если бы кодировки строк совпадали то авто-перекодирования не произошло бы и результирующая строка содержала кодировку слагаемых строк.
Авто-перекодирование обычно срабатывает когда происходит взаимодействие разных кодировок.


Пример авто-преобразования кодировок в сравнении

В сравнении 1, кодировка utf8 преобразовалась в unicode и сравнение произошло корректно.
В сравнении 2, сравниваются кодировки одного вида - обе внешние, т.к. кодированы они в разных кодировках условие выдало что они не равны.
В сравнении 3, выпало предупреждение из за того что выполняется сравнение кодировок разного вида - рабочая и внешняя, а авто-декодирование не произошло т.к. стандартная внешняя кодировка = utf8, и декодировать строку в кодировке cp1251 методом utf8 питон не смог.

При выводе списка, происходит вызов [<repr>]() который возвращает внутреннее представление этого спиcка - print 1 и 2 являются аналогичными. Для корректного вывода списка, его нужно преобразовать в строку - print 3.


Работа с файлами в Питоне представлена широким набором возможностей. Имеются как встроенные инструменты, так и сторонние модули и библиотеки, позволяющие открывать и читать документы, а также записывать в них любую информацию.

Python умеет взаимодействовать со следующими форматами файлов: txt, jpg, csv, json, html, xlsx, pdf и целым рядом других. Удобство заключается в том, что для каждого случая есть отдельный модуль, ускоряющий разработку.

В данной статье в формате «how to» рассмотрим основной инструментарий для осуществления работы с документами различных типов в Python.

Виртуальная среда под проекты

Язык Python удобен тем, что может взаимодействовать с разными проектами при различных настройках. Как сказал создатель протокола BitTorrent Брэм Коен:

Важно то, что инкапсуляция работает не только на уровне объектов и классов, но и в масштабах самого языка. Мы можем создавать проекты с отличающимися настройками, и они не будут друг другу «мешать».

Хорошей практикой считается активация виртуальной среды под конкретную проблему. Другими словами, устанавливать библиотеки нужно не глобально, для всей операционной системы, а для отдельного проекта. В этом помогает виртуальное окружение. Прежде чем переходить к написанию кода, нужно сформировать окружение проекта.

В 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).

Также вкладка получит название «Запись».

Файлы операционной системы

Встроенный модуль os позволяет просматривать содержимое каталогов и редактировать его.

Ознакомимся со следующими функциями:

  • mkdir() – создание папки в выбранном каталоге;
  • walk() – определение списка всех файлов и директорий внутри заданной и ее подпапках;
  • remove() – удаление файла из системы;
  • rename() – переименование документа и пр.

Приведем несколько примеров работы с библиотекой.

Редактирование изображений в Питоне

Для работы с картинками используют внешний модуль Pillow. Он позволяет создавать и изменять рисунки, а также накладывать на них текст.

В первую очередь следует установить модуль:

Нарисуем квадрат красного цвета с длиной стороны 400 пикселей, применим к нему фильтр размытия, а затем сделаем его черно-белым.

Рисунок 3 – Красный квадрат Рисунок 4 – Размытие картинки Рисунок 5 – Преобразование в черно-белый цвет

Заключение

Мы рассмотрели лишь часть возможностей Питона по работе с файлами. Создание, считывание, вывод в файлы может осуществляться разными способами. Более того, практически все форматы и типы документов могут редактироваться при помощи Python. В зависимости от задачи найти нужный модуль не составит труда.

Ответы на вопросы читателей

При постоянной практике и достаточном ежедневном внимании к языку Python основам синтаксиса и базовым операциям можно научиться за 1-2 месяца. Уверенное владение базовыми библиотеками, популярными сторонними модулями, объектно-ориентированном подходе может потребовать от 3 до 6 месяцев. Нужно осознавать и то, что для каждого обучаемого сроки индивидуальны. Взаимодействие с текстовыми файлами связано с функциями open(), close(), read(), readlines(), контекстным менеджером with и рядом других. Эти инструменты позволяют как читать документы, так и осуществлять в них запись.

Универсальный формат табличной информации – csv (Comma Separated Values, разделенные запятой данные). Его хорошо понимают разные сайты, среды разработки, операционные системы.

Чтобы взаимодействовать с excel-файлами требуется установить модуль openpyxl.

Для работы с Гугл-таблицами нужно получить доступ к программному интерфейсу в качестве разработчика.

Информация на Интернет-ресурсах зачастую представлена в виде json-данных. Она очень напоминает словари (dictionaries) в Питоне. Именно поэтому работать с этим форматом очень удобно.

Он используется для передачи и получения информации между API сайтов и программ.

Какой модуль используется для взаимодействия с файлами операционной системы? Встроенная библиотека os позволяет работать с каталогами и файлами операционной системы. Возможности не ограничены конкретной «операционкой» и в большинстве случаев универсальны. Набор инструментария следующий: представление списка документов конкретной папки, создание папок, удаление каталогов и документов, переименование файлов и др.

После создания файлового объекта его можно прочитать полностью и вывести на печать.

Читайте также: