Урок 32 Файлы

open(), with as, чтение строк, разбор чисел, запись данных

⏱ ~12 мин чтения· 📘 Базовый

Зачем работать с файлами?

Программы часто обрабатывают данные из внешних источников: результаты измерений, таблицы с баллами, списки имён, лог-файлы. Все эти данные хранятся в текстовых файлах, и Python умеет их читать.

В этом уроке мы научимся:

  • Открывать файл с помощью open()
  • Читать файл целиком и построчно
  • Извлекать числа из строк разного формата
  • Записывать данные в новый файл
  • Автоматически закрывать файл с with as

⚠️ Важно: весь код этого урока можно запустить у себя на компьютере. Создайте рядом с программой текстовые файлы с примерами данных и экспериментируйте!

Функция open() и режимы

Чтобы открыть файл, используется функция open(имя_файла, режим). Основные режимы:

РежимЧто делает
"r"чтение (read) — файл должен существовать
"w"запись (write) — создаёт новый файл или перезаписывает существующий
"a"добавление (append) — дописывает в конец файла
"r+"чтение и запись
```python f = open("data.txt", "r") # открыть для чтения content = f.read() # прочитать всё содержимое f.close() # обязательно закрыть! ```

Однако у этого подхода есть недостаток: если между open() и close() произойдёт ошибка, файл может остаться незакрытым.

Конструкция with as (рекомендуемый способ)

Конструкция with open(...) as f: гарантирует, что файл будет закрыт автоматически, даже если внутри блока произошла ошибка.

with open("data.txt", "r") as f:
    content = f.read()
    print(content)
# файл закрыт — можно не вызывать f.close()

Способы чтения файла

Методы объекта файла для чтения:

  • f.read() — прочитать весь файл одной строкой
  • f.readlines() — прочитать все строки в список
  • for line in f: — перебрать строки в цикле (экономит память)
# Чтение целиком
with open("poem.txt", "r") as f:
    text = f.read()
    print(text)

# Чтение в список строк
with open("poem.txt", "r") as f:
    lines = f.readlines()
    print("Количество строк:", len(lines))

# Построчный перебор (для больших файлов)
with open("poem.txt", "r") as f:
    for line in f:
        print(line.strip())   # strip() убирает лишние пробелы и \n

Пример 1: одно целое число в каждой строке

Допустим, в файле numbers.txt записаны целые числа, по одному на строку:

# Содержимое numbers.txt:
42
17
100
-5
8

Прочитаем числа из файла в список

f = open('nums.txt')
a = [int(s) for s in f]

Списочное выражение для каждой строчки в файле for s in f помещает в список строку преобразованную в число int(s).

Пример 2: два вещественных числа в каждой строке

В файле pairs.txt в каждой строке записаны два числа с плавающей точкой, разделённые пробелом:

# Содержимое pairs.txt:
3.5 2.0
1.1 4.8
7.0 0.5
6.6 3.3
with open("pairs.txt", "r") as f:
    for line in f:
        parts = line.strip().split()       # ["3.5", "2.0"]
        a = float(parts[0])
        b = float(parts[1])

Сначала strip() убирает \n, затем split() разделяет строку по пробелам, и float() преобразует каждую часть в вещественное число.

Пример 3: неопределённое количество чисел в каждой строке

В файле matrix.txt записана таблица чисел. В каждой строке неопределённое количество целых чисел, но мы заранее не знаем, сколько именно:

# Содержимое matrix.txt:
1 2 3 4
5 6 7 8
9 10 11 12

Прочитаем матрицу в список списков

f = open('nums.txt')
a = [[int(x) for x in s.split()] for s in f]

# rows = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

Списочное выражение для каждой строчки в файле for s in f помещает в список список чисел в строке. Для этого для каждого фрагмента строки полученного после разделения её на пробельные символы for x in s.split() в список попадает целочисленное представление чисел int(x).

Пример 4: файл состоит из одной строки

Иногда все данные записаны в одну строку:

# Содержимое oneline.txt:
LKASJNLKASJNDFLKJSADNHFLKJASHDFLKJHASDLFKHASLKDJFHASKLDFS
s = open('oneline.txt').readline() # прочитать первую строчку из файла

Запись в текстовый файл

Для записи используется режим "w" (перезапись) или "a" (добавление). Метод f.write() записывает строку. Чтобы перейти на новую строку, нужно явно добавить \n.

# Запись списка чисел в файл
numbers = [10, 20, 30, 40, 50]

with open("output.txt", "w") as f:
    for n in numbers:
        f.write(str(n) + "\n")

print("Файл output.txt создан!")

Содержимое output.txt после выполнения:

10
20
30
40
50

Ещё пример — запись таблицы (матрицы) в файл:

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

with open("matrix_out.txt", "w") as f:
    for row in matrix:
        line = " ".join(map(str, row))   # "1 2 3"
        f.write(line + "\n")

print("Матрица записана в matrix_out.txt")

Обработка ошибок при работе с файлами

При открытии файла может возникнуть ошибка — например, файл не существует. Используем try/except (урок 27):

try:
    with open("missing.txt", "r") as f:
        content = f.read()
except FileNotFoundError:
    print("Файл не найден! Проверьте имя файла.")
except PermissionError:
    print("Нет прав на чтение файла.")

Практический пример: анализ результатов

В файле scores.txt хранятся результаты учеников: в каждой строке имя и три оценки через пробел.

# Содержимое scores.txt:
Анна 85 90 78
Борис 92 88 95
Вика 76 81 79
Глеб 95 89 92

Прочитаем, вычислим средний балл каждого ученика и запишем результат в новый файл:

with open("scores.txt", "r") as f_in:
    results = []
    for line in f_in:
        parts = line.strip().split()          # ["Анна", "85", "90", "78"]
        name = parts[0]
        scores = list(map(int, parts[1:]))    # [85, 90, 78]
        avg = sum(scores) / len(scores)
        results.append(f"{name}: {avg:.2f}")

with open("averages.txt", "w") as f_out:
    for result in results:
        f_out.write(result + "\n")

print("Результаты записаны в averages.txt")

Обратите внимание: данные читаются из одного файла (f_in), а записываются в другой (f_out). Оба файла открыты через with, поэтому они гарантированно закроются.

Резюме

  • open(файл, режим) — открывает файл в заданном режиме
  • Режимы: "r" (чтение), "w" (запись), "a" (добавление)
  • with open(...) as f: — безопасное открытие с автозакрытием
  • f.read() — прочитать весь файл строкой
  • for line in f: — перебор строк (экономит память)
  • f.write(строка) — запись строки в файл
  • strip() убирает \n, split() делит строку на части
  • int() / float() преобразуют строку в число

⚠️ Важно: Совет: создайте несколько текстовых файлов с разными форматами данных и потренируйтесь их читать — это один из самых полезных навыков для начинающего программиста.