Файлы
На экзамене данные для второй части лежат в файлах: тысячи чисел, строка на миллион символов, пары чисел. Учимся читать их тремя способами, которых хватит на все номера.
- 1open и чтение по строкам
- 2Числа из файла в список
- 3Одна длинная строка
- 4Первая строка особая
- 5Сломай код
- 6Где пригодится на ЕГЭ
open и чтение по строкам
На ЕГЭ к задаче прикладывают файл, например 17.txt. Его кладут в ту же папку, что и программу, и открывают по имени через open. Самый простой способ прочитать файл: пройти по нему циклом, как по списку. Каждый шаг даёт одну строку.
k = 0 for line in open('chisla.txt'): k += 1 print('Строк в файле:', k)
Посмотрим на сами строки. readline() читает одну строку:
f = open('chisla.txt') line = f.readline() print(repr(line)) # repr показывает строку вместе с невидимыми символами
Видно '-6097\n'. На конце каждой строки файла стоит перевод строки \n, невидимый символ. Для чисел это не страшно: int его сам отбросит. А строки сравнивать с ним нельзя, поэтому его убирают методом strip():
f = open('chisla.txt') line = f.readline() print(repr(line.strip())) print(int(line)) # int сам справляется с \n
Числа из файла в список
Самый частый формат: по одному числу в строке. Читаем всё в список генератором из темы 6, одной строкой:
a = [int(x) for x in open('chisla.txt')] print(len(a)) print(a[:5]) # первые пять, чтобы глазами проверить print(max(a), min(a))
Дальше это обычный список, и с ним работает всё из темы 6: соседи, sum, max, генераторы.
Прочитал файл, сразу выведи len(a) и первые несколько элементов. Сравни с тем, что видишь, если открыть файл в блокноте. Это ловит ошибки чтения до того, как ты начал решать.
Сколько отрицательных чисел в файле chisla.txt?
Одна длинная строка
В №24 файл это одна очень длинная строка из букв. Читаем её readline() и сразу отрезаем \n:
s = open('stroka.txt').readline().strip() print(len(s)) print(s[:30])
Дальше работаем как со строкой из темы 4. Например, самая длинная цепочка подряд идущих букв Y:
s = open('stroka.txt').readline().strip() cur = 0 best = 0 for c in s: if c == 'Y': cur += 1 else: cur = 0 best = max(best, cur) print(best)
Обрати внимание, что этот код проще, чем «одинаковые соседи» в теме 4: тут нужна цепочка одной конкретной буквы, поэтому сравниваем каждую букву с 'Y'.
Какова длина самой длинной цепочки подряд идущих букв X в файле stroka.txt?
Первая строка особая
В №26 и №27 в первой строке файла обычно стоит количество записей, а дальше идут строки по два-три числа через пробел. Читаем так: сначала первую строку отдельно, потом цикл по остальным.
f = open('pary.txt') n = int(f.readline()) # первая строка: сколько пар print('Пар:', n) k = 0 for line in f: # цикл продолжит с того места, где остановился readline x = line.split() # '766 929' превращается в ['766', '929'] a = int(x[0]) b = int(x[1]) if a > b: k += 1 print('Пар, где первое больше второго:', k)
Строку с несколькими числами разрезаем split() и каждую часть переводим в int. Короче то же самое пишут через map, она применяет int к каждой части:
f = open('pary.txt') n = int(f.readline()) s = 0 for line in f: a, b = map(int, line.split()) # сразу два числа if a % 2 == 0: s += b print(s)
a, b = ... раскладывает два значения по двум переменным, как обмен местами в теме 6.
Чему равна сумма вторых чисел в тех строках файла pary.txt, где первое число чётное?
Сломай код
FileNotFoundError: файла нет
a = [int(x) for x in open('chisla.text')]
No such file or directory. Опечатка в имени: .text вместо .txt. На экзамене ещё бывает, что файл лежит не в той папке, что программа. Держи их рядом.
ValueError: два числа в одной строке
f = open('pary.txt') f.readline() for line in f: a = int(line)
invalid literal for int() with base 10: '766 929\n'. В строке два числа, и int не знает, какое брать. Сначала split().
Тихая ошибка: забыли strip
s = open('stroka.txt').readline() print(len(s)) print(s[-1] == 'X')
Длина на 1 больше настоящей, а последний символ это не буква, а \n. Для строки обязательно .strip(), иначе ответы про конец строки и длину будут неверными.
Где пригодится на ЕГЭ
| Номер | Как выглядит файл | Как читать |
|---|---|---|
| №17 | по числу в строке | [int(x) for x in open(...)] |
| №24 | одна длинная строка | open(...).readline().strip() |
| №26 | первая строка особая, дальше числа | readline(), потом цикл |
| №27 | строки по два числа (координаты) | map(int, line.split()) |
| №9 | таблица, строки по несколько чисел | map(int, line.split()) или Excel |
Как это собирается в №17. Пара это два соседних числа. Сколько пар, где хотя бы одно число делится на 7?
a = [int(x) for x in open('chisla.txt')] k = 0 for i in range(len(a) - 1): if a[i] % 7 == 0 or a[i + 1] % 7 == 0: k += 1 print(k)
Тут сразу три темы: файл, список и соседи, условие с or.
Для тех же пар из chisla.txt, где хотя бы одно число делится на 7, найди наибольшую сумму пары.
К блокам с кодом уже приложены учебные файлы, open их находит, как на экзамене. Файлы можно скачать и открыть у себя.