Программирование и IT
Python: чтение файла
Работа с файлом состоит из трёх шагов: открыть, прочитать или записать, закрыть. Закрытие лучше не делать руками — для этого есть оператор `with`. А главный параметр, про который забывают, — кодировка: без неё один и тот же код на разных машинах читает файл по-разному.
В этой статье
Открыть правильно: оператор with#
=
with закрывает файл сам — и когда блок закончился нормально, и когда внутри
случилось исключение. Ручной вариант f = open(...) / f.close() работает,
но при ошибке между этими строками файл остаётся открытым, а данные записи —
не сброшенными на диск.
Режим задаётся вторым аргументом:
| Режим | Что делает |
|---|---|
r |
чтение, по умолчанию; файла нет — FileNotFoundError |
w |
запись; существующий файл обнуляется |
a |
дозапись в конец, файл создаётся при отсутствии |
x |
создание; файл уже есть — FileExistsError |
rb wb |
двоичный режим, работа с bytes |
Самая дорогая ошибка новичка — открыть для проверки файл в режиме w:
содержимое исчезает в момент открытия, ещё до первой записи.
Три способа прочитать#
= # всё одной строкой
= # список строк, с переводами строк внутри
# по одной строке, файл любого размера
Третий способ — основной. Файловый объект сам является итератором и отдаёт
строки по одной, не загружая в память весь файл: так читают и сто строк, и
гигабайтный журнал.
Каждая строка приходит вместе с завершающим \n, поэтому print(line) даёт
двойные переносы. Убирают их rstrip("\n") — именно с аргументом, иначе
rstrip() срежет заодно и значимые пробелы в конце строки.
=
Такое выражение считает сумму чисел из файла, не создавая списка, — приём из
статьи про генераторы.
Запись и дозапись#
=
write не добавляет перевод строки — его ставят сами. writelines тоже не
добавляет, вопреки названию: он просто пишет элементы подряд. Поэтому для
списка строк удобнее "\n".join(...), как в третьем примере — про сам метод
написано в статье про строки.
Печать умеет писать прямо в файл: print("текст", file=f) — и перевод строки
она ставит сама.
Кодировка#
Без аргумента encoding Python берёт кодировку по умолчанию для системы. На
Linux и macOS это обычно UTF-8, а на Windows исторически может быть
однобайтовая кодовая страница. Один и тот же код тогда читает файл
по-разному: на одной машине текст, на другой — UnicodeDecodeError или
нечитаемые символы.
Правило простое: указывай encoding="utf-8" в каждом вызове open для
текста. Если файл пришёл из старой программы и в UTF-8 не читается, пробуй
encoding="cp1251". Когда встречаются единичные битые байты и терять файл
жалко, помогает errors="replace" — непрочитанные места станут знаком замены
вместо падения.
Двоичный режим кодировки не имеет вовсе: open(path, "rb") отдаёт bytes, и
аргумент encoding с ним несовместим.
Ошибки и короткая запись через pathlib#
=
=
FileNotFoundError — нормальная ситуация, её ловят; как устроен перехват,
разобрано в статье про исключения. Рядом
встречаются PermissionError (нет прав) и IsADirectoryError (указали папку).
Для коротких операций в стандартной библиотеке есть pathlib:
=
# привет
# True .txt notes
Path умеет складывать пути через /: Path("data") / "2026" / "log.txt" —
это работает одинаково на всех системах, в отличие от склейки строк со
слэшами.
Практика: создай файл из десяти строк, прочитай его построчно и запиши
в новый файл только строки длиннее пяти символов, добавив в начало каждой
номер. Проверь, что исходный файл не пострадал.
План по этапам
- Создать и прочитатьЗаписать три строки в файл в режиме w, затем прочитать его целиком через with.
- Построчный переборПройти по файлу циклом for и убрать завершающий перевод строки через rstrip("\n").
- ДозаписьОткрыть тот же файл в режиме a, добавить строку и убедиться, что старое содержимое на месте.
- Поймать отсутствие файлаОбратиться к несуществующему имени и обработать FileNotFoundError.
- Повторить через pathlibСделать то же самое методами Path.read_text и Path.write_text с явной кодировкой.
Начать изучать эту тему у себя
План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.
Проверь себя
1.В каком режиме открытия существующий файл обнуляется?
2.Что делает оператор with при работе с файлом?
3.Какое исключение возникнет при open("нет-такого.txt") в режиме r?
4.Файл содержит строки «10», «20», «30». Чему равно sum(int(line) for line in open("nums.txt", encoding="utf-8"))?
Источники
-
Чтение и запись файлов в учебнике PythonРаздел Reading and Writing Files: with, режимы, методыбесплатно
-
Функция open в справочникеВсе аргументы open: mode, encoding, errors, newlineбесплатно
-
Модуль pathlibПути как объекты, read_text и write_textбесплатно
Было полезно?