---
title: Файлы и форматы
questionDates:
  q-transfer-0180: '2026-10-01'
  q-transfer-0181: '2026-10-01'
  q-transfer-0182: '2026-10-01'
seo:
  description: >-
    Тема «Файлы и форматы» для собеседования Python Developer. Чем json.load
    отличается от json.loads? Почему при чтении файла важно явно указывать
    encoding?
  title: Файлы и форматы — Python Developer
---

[Все темы Python Developer](/prep/python-developer)

## Чем json.load отличается от json.loads? [#q-transfer-0180]

`json.load(file_obj)` читает JSON из текстового файлового объекта, а `json.loads(text)` разбирает строку, `bytes` или `bytearray`. Файл обычно открывают через `with open(path, encoding='utf-8')`. Синтаксическая ошибка дает `JSONDecodeError`, но корректный JSON может иметь корнем число, строку, список или `null`, а не только объект. Типы, обязательные поля и бизнес-ограничения проверяют отдельно. Границу формата проверяют на пустом, поврежденном и слишком большом входе, а ресурс закрывают детерминированно.

:::note[Ссылки для изучения]

1. [JSON из строки и файлового объекта: примеры json.loads и json.load](https://docs-python.ru/standart-library/modul-json-python/priemy-raboty-modulem-json/)
   :::

---

## Почему при чтении файла важно явно указывать encoding? [#q-transfer-0181]

Кодировка определяет соответствие байтов символам. Если полагаться на системное значение по умолчанию, один и тот же файл может читаться по-разному на разных машинах. Для известного формата задают, например, `encoding='utf-8'`; несовпадение обычно приводит к `UnicodeDecodeError`. Режимы `errors='ignore'` и `replace` могут тихо потерять данные, поэтому их применяют только при осознанной стратегии очистки и учете повреждений. Границу формата проверяют на пустом, поврежденном и слишком большом входе, а ресурс закрывают детерминированно.

:::note[Ссылки для изучения]

1. [Явная кодировка текстового файла и зависимость от версии и режима Python](https://asyncio.ru/3.15/library/io.html#text-encoding)
   :::

---

## Чем io.StringIO отличается от io.BytesIO? [#q-transfer-0182]

`StringIO` хранит текст `str`, а `BytesIO` хранит байты. Оба дают файловый интерфейс в памяти: `read`, `write`, `seek`, `tell`, поэтому удобны для тестирования кода, принимающего поток. Между ними нужна явная операция `encode` или `decode`; запись строки в `BytesIO` ошибочна. Они держат содержимое в памяти, поэтому не подходят как безразмерная замена временному файлу. Границу формата проверяют на пустом, поврежденном и слишком большом входе, а ресурс закрывают детерминированно.

:::note[Ссылки для изучения]

1. [StringIO и BytesIO: текстовые и двоичные файловые потоки в памяти](https://asyncio.ru/3.15/library/io.html)
   :::
