Каждый раз, закрывая игру «Угадай число», вы теряли рекорды. А телефонная книга из прошлых статей исчезала после завершения программы. Обидно, правда? Пришло время исправить это. Научим Python сохранять данные в файлы и читать их обратно. После этой статьи ваши программы станут по-настоящему полезными.
1. Почему файлы — это важно
Программы работают в оперативной памяти. Когда приложение закрывается, всё, что не сохранено, исчезает. Файлы позволяют:
- хранить данные между запусками,
- обмениваться информацией с другими программами,
- логировать события,
- работать с большими объёмами данных.
Python делает работу с файлами простой и элегантной.
2. Открытие файла: базовые режимы
Чтобы открыть файл, используем функцию open(). Первый аргумент — путь к файлу, второй — режим:
Режим Описание
'r' чтение (по умолчанию)
'w' запись (создаёт новый файл или перезаписывает существующий)
'a' добавление в конец
'x' создание файла, если он уже существует — ошибка
'b' бинарный режим (например, 'rb', 'wb')
't' текстовый режим (по умолчанию)
Важно: после работы файл нужно закрыть методом .close(). Но лучше использовать конструкцию with — она закрывает файл автоматически.
with open("example.txt", "w", encoding="utf-8") as file:
file.write("Привет, мир!")
3. Запись в файл: write и writelines
Запись строки
with open("data.txt", "w", encoding="utf-8") as f:
f.write("Строка номер один\n")
f.write("Вторая строка\n")
Запись нескольких строк из списка
lines = ["Python\n", "Java\n", "C++\n"]
with open("langs.txt", "w", encoding="utf-8") as f:
f.writelines(lines)
Добавление в конец (режим 'a')
with open("data.txt", "a", encoding="utf-8") as f:
f.write("Дописываем строку\n")
4. Чтение из файла: read, readline, readlines
Чтение всего файла целиком
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
Чтение построчно
with open("data.txt", "r", encoding="utf-8") as f:
for line in f:
print(line, end="") # line уже содержит \n
Получить список всех строк
with open("data.txt", "r", encoding="utf-8") as f:
lines = f.readlines() # возвращает список строк
5. Работа с популярными форматами
Текстовый файл (простой)
Идеально для логов, заметок, списков.
CSV (Comma-Separated Values)
Часто используется для таблиц. В Python есть встроенный модуль csv.
import csv
# Запись
with open("users.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["Имя", "Возраст"])
writer.writerow(["Анна", 28])
writer.writerow(["Иван", 25])
# Чтение
with open("users.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row)
JSON — современный стандарт
Отлично подходит для хранения структур данных (словарей, списков). Модуль json входит в стандартную библиотеку.
import json
data = {
"name": "Анна",
"age": 28,
"skills": ["Python", "Git"]
}
# Запись
with open("user.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
# Чтение
with open("user.json", "r", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["name"])
Параметры ensure_ascii=False и indent=4 делают файл читаемым и корректно сохраняют русские символы.
6. Работа с бинарными файлами
Если нужно сохранить изображение, звук или любой другой бинарный объект, используйте режим 'b'.
with open("image.jpg", "rb") as src:
data = src.read()
with open("copy.jpg", "wb") as dst:
dst.write(data)
7. Типичные ошибки новичков
❌ Забыли указать кодировку
На Windows системная кодировка может отличаться от UTF-8, что приведёт к кракозябрам. Всегда добавляйте encoding="utf-8".
❌ Не закрыли файл
Если не использовать with, файл может остаться открытым, и данные не сохранятся полностью. Используйте контекстный менеджер всегда.
❌ Пытаемся писать в файл, открытый на чтение
f = open("data.txt", "r")
f.write("new line") # IOError
❌ Забыли newline='' в CSV
При записи CSV на Windows могут появляться лишние пустые строки. Параметр newline='' решает проблему.
❌ Путаница между write и writelines
writelines не добавляет автоматически переводы строк. Если нужно, чтобы каждая строка была с новой строки, добавьте \n самостоятельно.
8. Живой пример: сохраняем телефонную книгу
Вернёмся к телефонной книге из статьи про списки и словари. Добавим сохранение и загрузку в JSON.
import json
import os
DATA_FILE = "contacts.json"
def load_contacts():
"""Загружает контакты из файла."""
if not os.path.exists(DATA_FILE):
return []
with open(DATA_FILE, "r", encoding="utf-8") as f:
return json.load(f)
def save_contacts(contacts):
"""Сохраняет контакты в файл."""
with open(DATA_FILE, "w", encoding="utf-8") as f:
json.dump(contacts, f, ensure_ascii=False, indent=4)
def main():
contacts = load_contacts()
while True:
print("\n1. Добавить контакт")
print("2. Найти контакт")
print("3. Показать все")
print("4. Выход")
choice = input("Выберите действие: ")
if choice == "1":
name = input("Имя: ")
phone = input("Телефон: ")
contacts.append({"name": name, "phone": phone})
save_contacts(contacts)
print(f"Контакт {name} добавлен и сохранён.")
elif choice == "2":
search = input("Введите имя для поиска: ")
found = [c for c in contacts if c["name"].lower() == search.lower()]
if found:
for c in found:
print(f"{c['name']} — {c['phone']}")
else:
print("Не найдено.")
elif choice == "3":
for c in contacts:
print(f"{c['name']} — {c['phone']}")
elif choice == "4":
print("До свидания!")
break
else:
print("Неверный выбор.")
if __name__ == "__main__":
main()
Теперь контакты не исчезают после закрытия программы. Файл contacts.json создаётся в той же папке и может быть открыт в любом текстовом редакторе.
Заключение
Файлы открывают новую эру ваших проектов. Вы можете:
- сохранять пользовательские данные,
- вести логи,
- экспортировать отчёты в CSV,
- хранить настройки в JSON.
Освоив работу с файлами, вы готовы создавать полноценные приложения. В следующей статье разберём обработку исключений — чтобы ваши программы не падали от любой ошибки, а красиво сообщали о проблеме и продолжали работать.
Попробуйте добавить файловое хранение в одну из своих старых программ — и увидите, как изменится восприятие вашего кода. Делитесь результатами в комментариях!
Статья подготовлена для канала «Код как искусство». Подписывайтесь, чтобы писать программы, которые не забывают.