PythonPython 9. Файлы0%
Python для ЕГЭ · тема 9 из 11

Файлы

На экзамене данные для второй части лежат в файлах: тысячи чисел, строка на миллион символов, пары чисел. Учимся читать их тремя способами, которых хватит на все номера.

6 разделов~35 минут№9, 17, 24, 26, 27
  1. 1open и чтение по строкам
  2. 2Числа из файла в список
  3. 3Одна длинная строка
  4. 4Первая строка особая
  5. 5Сломай код
  6. 6Где пригодится на ЕГЭ
Раздел 1 из 6

open и чтение по строкам

На ЕГЭ к задаче прикладывают файл, например 17.txt. Его кладут в ту же папку, что и программу, и открывают по имени через open. Самый простой способ прочитать файл: пройти по нему циклом, как по списку. Каждый шаг даёт одну строку.

python
k = 0
for line in open('chisla.txt'):
    k += 1
print('Строк в файле:', k)

скачать chisla.txt

Посмотрим на сами строки. readline() читает одну строку:

python
f = open('chisla.txt')
line = f.readline()
print(repr(line))     # repr показывает строку вместе с невидимыми символами

скачать chisla.txt

Видно '-6097\n'. На конце каждой строки файла стоит перевод строки \n, невидимый символ. Для чисел это не страшно: int его сам отбросит. А строки сравнивать с ним нельзя, поэтому его убирают методом strip():

python
f = open('chisla.txt')
line = f.readline()
print(repr(line.strip()))
print(int(line))       # int сам справляется с \n

скачать chisla.txt

Раздел 2 из 6

Числа из файла в список

Самый частый формат: по одному числу в строке. Читаем всё в список генератором из темы 6, одной строкой:

python
a = [int(x) for x in open('chisla.txt')]
print(len(a))
print(a[:5])          # первые пять, чтобы глазами проверить
print(max(a), min(a))

скачать chisla.txt

Дальше это обычный список, и с ним работает всё из темы 6: соседи, sum, max, генераторы.

Привычка

Прочитал файл, сразу выведи len(a) и первые несколько элементов. Сравни с тем, что видишь, если открыть файл в блокноте. Это ловит ошибки чтения до того, как ты начал решать.

Попробуй самучебная задача

Сколько отрицательных чисел в файле chisla.txt?

Раздел 3 из 6

Одна длинная строка

В №24 файл это одна очень длинная строка из букв. Читаем её readline() и сразу отрезаем \n:

python
s = open('stroka.txt').readline().strip()
print(len(s))
print(s[:30])

скачать stroka.txt

Дальше работаем как со строкой из темы 4. Например, самая длинная цепочка подряд идущих букв Y:

python
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)

скачать stroka.txt

Обрати внимание, что этот код проще, чем «одинаковые соседи» в теме 4: тут нужна цепочка одной конкретной буквы, поэтому сравниваем каждую букву с 'Y'.

Попробуй самучебная задача

Какова длина самой длинной цепочки подряд идущих букв X в файле stroka.txt?

Раздел 4 из 6

Первая строка особая

В №26 и №27 в первой строке файла обычно стоит количество записей, а дальше идут строки по два-три числа через пробел. Читаем так: сначала первую строку отдельно, потом цикл по остальным.

python
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)

скачать pary.txt

Строку с несколькими числами разрезаем split() и каждую часть переводим в int. Короче то же самое пишут через map, она применяет int к каждой части:

python
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)

скачать pary.txt

a, b = ... раскладывает два значения по двум переменным, как обмен местами в теме 6.

Попробуй самучебная задача

Чему равна сумма вторых чисел в тех строках файла pary.txt, где первое число чётное?

Раздел 5 из 6

Сломай код

FileNotFoundError: файла нет

python
a = [int(x) for x in open('chisla.text')]

скачать chisla.txt

No such file or directory. Опечатка в имени: .text вместо .txt. На экзамене ещё бывает, что файл лежит не в той папке, что программа. Держи их рядом.

ValueError: два числа в одной строке

python
f = open('pary.txt')
f.readline()
for line in f:
    a = int(line)

скачать pary.txt

invalid literal for int() with base 10: '766 929\n'. В строке два числа, и int не знает, какое брать. Сначала split().

Тихая ошибка: забыли strip

python
s = open('stroka.txt').readline()
print(len(s))
print(s[-1] == 'X')

скачать stroka.txt

Длина на 1 больше настоящей, а последний символ это не буква, а \n. Для строки обязательно .strip(), иначе ответы про конец строки и длину будут неверными.

Раздел 6 из 6

Где пригодится на ЕГЭ

НомерКак выглядит файлКак читать
№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?

python
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)

скачать chisla.txt

Тут сразу три темы: файл, список и соседи, условие с or.

Попробуй самучебная задача

Для тех же пар из chisla.txt, где хотя бы одно число делится на 7, найди наибольшую сумму пары.

К блокам с кодом уже приложены учебные файлы, open их находит, как на экзамене. Файлы можно скачать и открыть у себя.