Найти в Дзене
Код как искусство

Файлы в Python: как научить программы запоминать

Каждый раз, закрывая игру «Угадай число», вы теряли рекорды. А телефонная книга из прошлых статей исчезала после завершения программы. Обидно, правда? Пришло время исправить это. Научим Python сохранять данные в файлы и читать их обратно. После этой статьи ваши программы станут по-настоящему полезными. Программы работают в оперативной памяти. Когда приложение закрывается, всё, что не сохранено, исчезает. Файлы позволяют: Python делает работу с файлами простой и элегантной. Чтобы открыть файл, используем функцию open(). Первый аргумент — путь к файлу, второй — режим: Режим Описание 'r' чтение (по умолчанию) 'w' запись (создаёт новый файл или перезаписывает существующий) 'a' добавление в конец 'x' создание файла, если он уже существует — ошибка 'b' бинарный режим (например, 'rb', 'wb') 't' текстовый режим (по умолчанию) Важно: после работы файл нужно закрыть методом .close(). Но лучше использовать конструкцию with — она закрывает файл автоматически. with open("example.txt", "w", enc
Оглавление

Каждый раз, закрывая игру «Угадай число», вы теряли рекорды. А телефонная книга из прошлых статей исчезала после завершения программы. Обидно, правда? Пришло время исправить это. Научим 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.

Освоив работу с файлами, вы готовы создавать полноценные приложения. В следующей статье разберём обработку исключений — чтобы ваши программы не падали от любой ошибки, а красиво сообщали о проблеме и продолжали работать.

Попробуйте добавить файловое хранение в одну из своих старых программ — и увидите, как изменится восприятие вашего кода. Делитесь результатами в комментариях!

Статья подготовлена для канала «Код как искусство». Подписывайтесь, чтобы писать программы, которые не забывают.