Зачем работать с файлами?
Программы часто обрабатывают данные из внешних источников: результаты измерений, таблицы с баллами, списки имён, лог-файлы. Все эти данные хранятся в текстовых файлах, и Python умеет их читать.
В этом уроке мы научимся:
- Открывать файл с помощью
open() - Читать файл целиком и построчно
- Извлекать числа из строк разного формата
- Записывать данные в новый файл
- Автоматически закрывать файл с
with as
⚠️ Важно: весь код этого урока можно запустить у себя на компьютере. Создайте рядом с программой текстовые файлы с примерами данных и экспериментируйте!
Функция open() и режимы
Чтобы открыть файл, используется функция open(имя_файла, режим). Основные режимы:
| Режим | Что делает |
|---|---|
"r" | чтение (read) — файл должен существовать |
"w" | запись (write) — создаёт новый файл или перезаписывает существующий |
"a" | добавление (append) — дописывает в конец файла |
"r+" | чтение и запись |
Однако у этого подхода есть недостаток: если между 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()преобразуют строку в число
⚠️ Важно: Совет: создайте несколько текстовых файлов с разными форматами данных и потренируйтесь их читать — это один из самых полезных навыков для начинающего программиста.