Обработка данных в файлах

Программа берёт числа не с клавиатуры, а из файла.
10 класс, углублённый уровень — занятие восьмое.

Урок 16 плана: текстовые и двоичные файлы, файловая переменная, чтение из файла, запись в файл. На ЕГЭ так устроено задание 17: файл на десять тысяч чисел, руками не посчитать — только программой.

Зачем файл, если есть input()

input()

Данные набирает человек. Пять чисел — можно. Десять тысяч — нет.

Файл

Данные уже лежат на диске: их записал прибор, другая программа, составитель ЕГЭ. Программа читает их сама, сколько бы их ни было.

Открыть файл и пройти по строкам

f = open("17.txt")
k = 0
for line in f:
    x = int(line)
    if x % 3 == 0:
        k = k + 1
print(k)

readline() — одна строка

f = open("data.txt")
n = int(f.readline())
s = 0
for i in range(n):
    x = int(f.readline())
    s = s + x
print(s)
data.txtкто прочитал
3n
10виток 1
20виток 2
5виток 3
100никто

Ловушка: последняя цифра отрицательного

В файлах ЕГЭ числа от −10000 до 10000. Какие оканчиваются на 7?

x % 10 == 7

−17 % 10 == 3 — пропустит.
−13 % 10 == 7 — засчитает.

abs(x) % 10 == 7

Последняя цифра — у модуля числа. Для −17 это 7, для −13 — 3.

Ловушка: старт наибольшего

Так — неверно

m = 0
for line in f:
    x = int(line)
    if abs(x) % 10 == 7:
        if x > m:
            m = x

Если все числа на 7 отрицательные — напечатает 0, которого в файле нет.

Так — верно

m = -10001
for line in f:
    x = int(line)
    if abs(x) % 10 == 7:
        if x > m:
            m = x

Старт меньше любого возможного числа: первое же подходящее его заменит.

Пары соседних: prev и x

f = open("17.txt")
prev = int(f.readline())
c = 0
for line in f:
    x = int(line)
    if (prev + x) % 3 == 0:
        c = c + 1
    prev = x
print(c)
файлпара (prev; x)сумма
4—
5(4; 5)9 ✓
7(5; 7)12 ✓
1(7; 1)8

Два прохода: когда условие зависит от всего файла

«Пары, где сумма больше наибольшего числа файла на 7». Пока файл не прочитан до конца, этого числа не знает никто.

f = open("17.txt")
M = -10001
for line in f:                 # первый проход: ищем M
    ...
f.close()
f = open("17.txt")             # закладка снова в начале
prev = int(f.readline())
for line in f:                 # второй проход: пары
    ...

Самая длинная серия

Серия — числа подряд, каждое строго больше предыдущего.

xcurbest
411
111
522
933
213
213
823

cur — длина серии, которая кончается на текущем числе.

best — лучшая до сих пор.

Запись в файл

f = open("data.txt")
g = open("out.txt", "w")
for line in f:
    x = int(line)
    if x > 0:
        print(x, file=g)
g.close()

Что делаем сегодня

№ФайлПрограмма
11.txtОтбор: сколько чисел оканчивается на 7 и наибольшее из них
22.txtПары соседних: хотя бы одно кратно 5, сумма больше M — наибольшего числа на 7. Два прохода
33.txtСамая длинная возрастающая серия: длина и первое число

Как работаем

  1. Открываем практикум из общей папки — сначала тренажёр: шесть задач на чтение программ с файлом, оценки за него нет.
  2. Под каждым заданием — кнопка «Скачать учебный файл». Кладём его рядом с программой, там же написано, что должно выйти.
  3. Пишем три программы в IDLE, сохраняем как zadanie1.py, zadanie2.py, zadanie3.py.
  4. Проверка.bat → «Найти мои файлы» → «Проверить всё».
Файл открываем по имени, без пути: open("1.txt"). Ошиблась программа — оболочка положит в папку файл proverka-1.txt, на котором это случилось.

Отметка: три задания — «5», два — «4», одно — «3». Попыток сколько угодно.

За работу

Сначала тренажёр, потом три программы.

Домашнее задание — на странице «Домашнее задание»: шесть типов задач на чтение программ с файлом, Python дома не нужен. В начале следующей пары — проверочная по этим же типам.

Материалы подготовлены с использованием технологий искусственного интеллекта. Пробел раскрыть и дальше · ← → слайды