ЧТЕНИЕ ФАЙЛОВ
Зачем это нужно
В заданиях второй части (17, 24, 26, 27) данные лежат в текстовом файле. Чтобы их обработать, файл сначала надо открыть и прочитать. Разберём все базовые способы — и что делать, когда чтение падает с ошибкой.
Открытие файла
1 2
Три способа прочитать
| Метод | Что вернёт |
|---|---|
| f.read() | весь файл одной строкой |
| f.readline() | одну строку |
| f.readlines() | список всех строк |
Готовые шаблоны под форматы данных
| Файл | Как читать |
|---|---|
| одна строка символов (24) | s = f.read().strip() |
| столбик чисел (17, 27) | [int(x) for x in f] |
| числа в строке через пробел | list(map(int, line.split())) |
Чтение чисел: главный шаблон
1 2 3 4
Если в строке несколько чисел через пробел — добавляем split():
1 2 3
Когда программа падает при чтении
Три типовые ситуации на экзамене:
- Файла нет или имя набрано неверно → FileNotFoundError. Программа не запускается вообще.
- В конце файла лишняя пустая строка → int("") даёт ValueError.
- В строке не то количество чисел → распаковка a, b = ... тоже даёт ValueError.
Всё это ловится конструкцией try / except.
Как устроен try / except
1 2 3 4
Питон выполняет блок try. Если внутри возникает ошибка указанного типа — управление прыгает в except, и программа продолжает работать вместо аварийного завершения.
| Исключение | Когда возникает |
|---|---|
| ValueError | int("abc"), int(""), распаковка не того количества значений |
| FileNotFoundError | файла нет рядом с программой, опечатка в имени |
| IndexError | обращение к a[i] за границей списка |
| KeyError | обращение к несуществующему ключу словаря |
| ZeroDivisionError | деление или % на ноль |
Указывать тип ошибки нужно всегда. Голый except: ловит вообще всё, включая твои собственные опечатки, — и ты не заметишь, что программа считает не то.
Пример из задания 26
Пусть в файле 26.txt в первой строке два числа — количество заявок N и вместимость склада M, а в каждой из следующих строк два числа: объём груза и его стоимость. Читаем устойчиво к пустым и битым строкам:
1 2 3 4 5 6 7 8 9 10 11
Проверка len(data) == n — бесплатная страховка: если числа разошлись, файл прочитан неправильно, и решать дальше бессмысленно.
1
Дальше идёт обычная логика 26 — сортировка по нужному критерию:
А если хочется подстраховаться ещё и от неверного имени файла:
1 2 3 4
