Читаем и пишем файлы в Python: текст, CSV и JSON
За полчаса научитесь открывать текстовые файлы, разбирать CSV и сохранять данные в JSON без сломанной кодировки и битых строк. Всё на стандартной библиотеке Python 3.12.

К концу этого гайда вы сможете прочитать текстовый файл в нужной кодировке, разобрать таблицу из CSV в список словарей и сохранить структуру данных в JSON так, чтобы русские буквы не превратились в \u0440\u0443. Нужен только установленный Python 3.10 или новее и любой текстовый редактор. На всё уйдёт около 30 минут, весь код работает на стандартной библиотеке — ничего доустанавливать не придётся.
Что нужно иметь до начала
- Python 3.10 или новее. Проверьте командой
python --versionв терминале. Примеры проверялись на Python 3.12, но всё работает и в 3.10+. - Рабочую папку. Создайте отдельную директорию и запускайте скрипты из неё — так файлы будут появляться там, где вы их ждёте, а не в домашнем каталоге.
- Понимание, что такое кодировка. Достаточно знать: текст на диске хранится в байтах, и правило перевода байтов в буквы называется кодировкой. Для новых файлов почти всегда используют UTF-8.
Модули csv и json входят в стандартную библиотеку Python — pip install для них не нужен.
Текстовые файлы: open и with
Базовая функция для работы с файлами — open(). Её почти всегда используют вместе с with: этот блок сам закроет файл, даже если внутри случится ошибка. Забытый закрытый файл — частая причина того, что данные не успевают записаться на диск.
Шаг 1. Записать текст
Создадим файл и запишем в него две строки:
# Python 3.12
# Режим "w" создаёт файл заново или перезаписывает существующий
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("Первая строка\n")
f.write("Вторая строка\n")
Проверка: в вашей рабочей папке должен появиться файл notes.txt. Откройте его в редакторе — увидите две строки текста.
Шаг 2. Прочитать текст обратно
# Python 3.12
with open("notes.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
Проверка: в терминале появятся обе строки. Если вместо русских букв вы видите кракозябры — вы не указали encoding="utf-8" либо файл сохранён в другой кодировке.
Шаг 3. Читать построчно
Читать файл целиком в память через read() плохо для больших файлов. Перебор по строкам не грузит в память весь файл сразу:
# Python 3.12
with open("notes.txt", "r", encoding="utf-8") as f:
for line in f:
# strip() убирает символ переноса в конце строки
print(line.strip())
Проверка: каждая строка печатается без лишнего пустого промежутка между ними.
Основные режимы open(), которые вам понадобятся:
| Режим | Что делает | Если файла нет |
|---|---|---|
"r" | Чтение | Ошибка FileNotFoundError |
"w" | Запись, стирает содержимое | Создаёт новый |
"a" | Дозапись в конец | Создаёт новый |
"x" | Запись, но только в новый файл | Создаёт; если есть — ошибка |
Всегда указывайте encoding="utf-8" явно. На Windows кодировка по умолчанию зависит от системных настроек, и без явного указания один и тот же скрипт даст разный результат на разных машинах.
CSV: таблицы без ручного парсинга
CSV — это текст, где строки таблицы разделены переносами, а колонки — запятыми. Разбирать его вручную через split(",") — ошибка: если внутри ячейки есть запятая или перенос строки, всё поедет. Модуль csv знает правила экранирования и делает это корректно.
Шаг 4. Записать CSV
# Python 3.12
import csv
rows = [
["name", "city", "age"],
["Анна", "Москва", 30],
["Игорь", "Казань", 25],
]
# newline="" обязателен: иначе на Windows появятся пустые строки
with open("people.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerows(rows)
Проверка: откройте people.csv в редакторе — увидите три строки, значения через запятую. Параметр newline="" — не опечатка, он нужен именно пустой.
Шаг 5. Прочитать CSV в словари
Удобнее читать не как списки, а как словари, где ключ — заголовок колонки. Для этого есть DictReader:
# Python 3.12
import csv
with open("people.csv", "r", encoding="utf-8", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
# row — это словарь: {"name": "Анна", "city": "Москва", "age": "30"}
print(row["name"], "из города", row["city"])
Проверка: в терминале появятся строки вида Анна из города Москва. Обратите внимание: возраст читается как строка "30", а не число — CSV не хранит типы, всё приходит текстом. Если нужно число, преобразуйте сами: int(row["age"]).
Разделитель не запятая
В русскоязычных выгрузках из Excel разделителем часто выступает точка с запятой, потому что запятая занята под десятичный разделитель. Укажите его явно:
# Python 3.12
import csv
with open("export.csv", "r", encoding="utf-8", newline="") as f:
reader = csv.DictReader(f, delimiter=";")
for row in reader:
print(row)
JSON: структуры данных как есть
JSON подходит, когда данные вложенные: словари внутри списков, списки внутри словарей. Модуль json переводит объекты Python в текст и обратно почти без потерь.
Шаг 6. Записать JSON
# Python 3.12
import json
data = {
"city": "Москва",
"users": [
{"name": "Анна", "age": 30},
{"name": "Игорь", "age": 25},
],
}
with open("data.json", "w", encoding="utf-8") as f:
# ensure_ascii=False сохраняет русские буквы читаемыми
# indent=2 делает файл с отступами, удобным для глаз
json.dump(data, f, ensure_ascii=False, indent=2)
Проверка: откройте data.json — увидите русские буквы, а не \u0410\u043d\u043d\u0430. Если буквы всё же превратились в escape-последовательности, вы забыли ensure_ascii=False.
Шаг 7. Прочитать JSON
# Python 3.12
import json
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f)
# data теперь обычный словарь Python
print(data["city"])
for user in data["users"]:
print(user["name"], user["age"])
Проверка: в терминале появится Москва, а затем имена и возраст. Здесь age уже число, а не строка — в отличие от CSV, JSON сохраняет типы.
Не путайте четыре функции модуля:
| Функция | Направление | Работает с |
|---|---|---|
json.dump | объект → файл | файловый объект |
json.load | файл → объект | файловый объект |
json.dumps | объект → строка | возвращает str |
json.loads | строка → объект | принимает str |
Правило простое: буква s в конце имени означает string — работа со строкой, а не с файлом.
Если не получилось
FileNotFoundError: [Errno 2] No such file or directory— Python ищет файл относительно папки, из которой запущен скрипт, а не относительно самого скрипта. Запустите из нужной папки или укажите полный путь.UnicodeDecodeError: 'utf-8' codec can't decode byte— файл сохранён в другой кодировке. Частый случай для старых выгрузок из Excel —encoding="cp1251". Попробуйте её вместо utf-8 при чтении.- Пустые строки между строками CSV на Windows — вы забыли
newline=""вopen(). Добавьте его и при чтении, и при записи. json.decoder.JSONDecodeError: Expecting value— файл повреждён, пуст или это не JSON. Откройте его глазами: часто там текст ошибки от API вместо данных.- Русские буквы стали
\u0430\u043dв JSON-файле — не передалиensure_ascii=Falseвjson.dump. Формально это валидный JSON и читается обратно без потерь, но глазами не читается.
Что дальше
Для путей к файлам вместо строк удобнее использовать модуль pathlib из стандартной библиотеки — он избавляет от возни со слешами на разных ОС. Для больших CSV, которые не влезают в память, читайте по строкам через DictReader и обрабатывайте по одной записи, а не собирайте всё в список. А если данных много и нужны фильтры и агрегации — присмотритесь к библиотеке pandas: она читает CSV и JSON одной строкой и работает с ними как с таблицами.
Субтитры и таймкоды: Расшифровка речи и субтитры по правилам читаемости: 42 знака в строке, две строки, минимум секунда на реплику.
Спросить за 40 ₽Источники: Python docs — Reading and Writing Files, Python docs — csv module
Частые вопросы
У меня Python 3.9 или 3.8 — код будет работать?
Как узнать кодировку файла, если чтение падает с UnicodeDecodeError?
Почему возраст из CSV приходит строкой, а из JSON числом?
Что будет, если открыть файл в режиме "w", а он уже существует?
Нужно ли вручную закрывать файл, если я использую with?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.