Skip to content

Files and IO

Files and I/O (Введення-Виведення)

Що таке файловий об'єкт

Файловий об'єкт - це об'єкт, який надає файлово-орієнтований API (методи read(), write() та ін.) для доступу до ресурсу. Залежно від способу створення, файловий об'єкт може надавати доступ до реального файлу на диску або іншого типу пристрою зберігання або передачі даних (стандартні потоки введення/виведення, буфери у пам'яті, сокети і т.д.). Файлові об'єкти також називають потоками. Файлові об'єкти є контекстними менеджерами.

Які існують типи файлових об'єктів

У Python існують три типи файлових об'єктів - Текстові файли (text files): Ці файли використовуються для роботи з текстовими даними. Вони працюють з рядками (строками) і автоматично виконують кодування і декодування символів, а також перетворення символів кінця рядка (\n, \r, \r\n) між стандартними відображенням в пам'яті та збереженням на диску. Для роботи з текстовими файлами використовуються класи TextIOWrapper і TextIO з модуля io. - Буферизовані бінарні файли (buffered binary files): Ці файли використовуються для роботи з бінарними даними. Вони працюють з байтами і зберігають дані без будь-яких змін або перетворень. Буферизовані бінарні файли мають більш ефективну систему буферизації для швидкого зчитування та запису даних. Для роботи з буферизованими бінарними файлами використовується клас BufferedReader з модуля io. - Небуферизовані бінарні файли (raw binary files): Ці файли також використовуються для роботи з бінарними даними. Вони працюють з байтами і не мають системи буферизації. Це означає, що дані безпосередньо записуються або зчитуються з диску при кожній операції. Для роботи з небуферизованими бінарними файлами використовується клас BufferedWriter з модуля io.

В чому відмінність текстових і бінарних файлів

Текстові файли записують і зчитують дані типу str і автоматично виконують перетворення кодувань і символів кінця рядка. Бінарні файли записують і зчитують дані типів bytes і bytearray і не виконують жодних маніпуляцій з даними: все записується і зчитується в тому ж самому вигляді, як зберігається.

Як користуватися функцією open

Сигнатура функції

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

Основні параметри: - file - ім'я файлу або файловий дескриптор - mode - режим відкриття файлу - encoding - кодування файлу - buffering - використовувати буферизацію: від'ємне число (за замовчуванням, явно вказувати не потрібно) - стандартне значення для даного типу файлового об'єкту, 0 - вимкнути буферизацію, 1 - построчна буферизація (для текстових файлів), інше значення - увімкнути буферизацію і встановити відповідний розмір буфера

Обов'язковим параметром є лише перший. Найчастіше функцію open() використовують з двома параметрами.

mode може починатися з символів "r" (читання), "w" (запис, очищує файл, якщо він вже існує), "x" (виключне створення, неуспішно, якщо файл вже існує), "a" (додавання, запис в кінець файлу). Також параметр mode може мати другу літеру для визначення типу файлу: "t" для текстового (за замовчуванням) і "b" для бінарного. Також можна додати символ "+" для відкриття в режимі читання і запису одночасно. Порядок останніх двох символів не має значення: "rb+" і "r+b" задають один і той же режим.

З чого складається процес закриття файлів

Після завершення роботи з файлом важливо обов'язково його закрити за допомогою методу close(), особливо якщо файл був відкритий для запису. При використанні буферизованого виводу дані, які записуються в файл, спочатку зберігаються в буфері. Вміст буфера записується в файл при його заповненні або при виклику методів flush() або close().

Крім того, якщо файл відкритий для запису, він буде заблокований для інших процесів на запис до моменту його закриття. Усі відкриті файли автоматично закриваються при видаленні відповідних файлових об'єктів з пам'яті збирачем сміття інтерпретатора Python або при завершенні роботи самого інтерпретатора, проте слід тримати файли відкритими мінімально необхідний час.

Що роблять методи tell і seek

Метод tell() повертає поточну позицію зчитування/запису в файлі. Метод seek(offset, whence) встановлює її. Параметр offset визначає зсув, а whence - точку, від якої цей зсув обчислюється: io.SEEK_SET(0) - початок файлу, io.SEEK_CUR(1) - поточна позиція, io.SEEK_END(2) - кінець файлу.

Що роблять StringIO і BytesIO

Класи io.StringIO і io.BytesIO представляють потоки для зчитування та запису в рядки або байтові рядки у пам'яті. Вони можуть використовуватися для використання рядків і байтових рядків як текстових і бінарних файлів. Надають інтерфейс файлу без взаємодії з файловою системою.

Чи є файлові об'єкти контекстними менеджерами

Так, вони є.

Що таке серіалізація

Серіалізація - це процес збереження об'єктів у бінарному або рядковому вигляді для зберігання, передачі та відновлення. Зворотний процес називається десеріалізацією.

json.dumps / json.dump, json.loads / json.load

Функція dumps модуля json зберігає представлення об'єкта у форматі JSON у рядок. Функція dump - у текстовий файл. Функція loads модуля json завантажує об'єкт з рядка. Функція load - з текстового файлу.

Що робити, якщо потрібно серіалізувати дані, які не підтримуються стандартним модулем json

Можна використовувати pickle або розширити класи JSONEncoder і JSONDecoder.

pickle.dumps / pickle.dump, pickle.loads / pickle.load

Функції dump, dumps, load і loads модуля pickle аналогічні за своїм призначенням відповідним функціям модуля json, але працюють з байтовими рядками та бінарними файлами.