Запись данных в файлы

Запись в файлы позволяет сохранять данные для последующего использования. Python предоставляет несколько способов записи данных в файлы различного формата.

Ключевые понятия

Основные методы записи

Рассмотрим основные методы записи данных в файлы:

Метод write()
# Запись строки в файл
with open("пример.txt", "w", encoding="utf-8") as файл:
    файл.write("Привет, мир!\n")
    файл.write("Это вторая строка.\n")

# Чтение файла для проверки
with open("пример.txt", "r", encoding="utf-8") as файл:
    содержимое = файл.read()
    print("Содержимое файла:")
    print(содержимое)

# Запись чисел (нужно преобразовать в строку)
числа = [1, 2, 3, 4, 5]
with open("числа.txt", "w", encoding="utf-8") as файл:
    for число in числа:
        файл.write(str(число) + "\n")

# Чтение чисел
with open("числа.txt", "r", encoding="utf-8") as файл:
    for строка in файл:
        print(int(строка.strip()))

Режимы записи файлов

Различные режимы открытия файлов для записи:

Режимы открытия файлов
# Режим "w" - перезапись файла
with open("тест.txt", "w", encoding="utf-8") as файл:
    файл.write("Первая строка\n")

# Повторная запись в режиме "w" удаляет предыдущее содержимое
with open("тест.txt", "w", encoding="utf-8") as файл:
    файл.write("Вторая строка\n")

with open("тест.txt", "r", encoding="utf-8") as файл:
    print(f"Содержимое после перезаписи: {файл.read()}")

# Режим "a" - добавление в конец файла
with open("тест.txt", "a", encoding="utf-8") as файл:
    файл.write("Третья строка (добавлена)\n")

with open("тест.txt", "r", encoding="utf-8") as файл:
    print(f"Содержимое после добавления: {файл.read()}")

# Режим "x" - создание нового файла (ошибка, если файл существует)
try:
    with open("новый_файл.txt", "x", encoding="utf-8") as файл:
        файл.write("Это новый файл\n")
    print("Файл успешно создан")
except FileExistsError:
    print("Файл уже существует!")

Метод writelines()

Метод writelines() позволяет записать список строк в файл:

Метод writelines()
# Создание списка строк
строки = [
    "Первая строка\n",
    "Вторая строка\n",
    "Третья строка\n"
]

# Запись списка строк в файл
with open("список.txt", "w", encoding="utf-8") as файл:
    файл.writelines(строки)

# Чтение для проверки
with open("список.txt", "r", encoding="utf-8") as файл:
    print("Содержимое файла:")
    print(файл.read())

# Запись списка без добавления символов новой строки
данные = ["Яблоко", "Банан", "Груша", "Апельсин"]
with open("фрукты.txt", "w", encoding="utf-8") as файл:
    for фрукт in данные:
        файл.write(фрукт + "\n")

# Или с использованием join()
with open("фрукты2.txt", "w", encoding="utf-8") as файл:
    файл.write("\n".join(данные))

Запись в различные форматы файлов

Python позволяет записывать данные в различные форматы файлов:

Запись CSV файлов
# Запись данных в формате CSV
студенты = [
    ["Имя", "Возраст", "Курс"],
    ["Анна", "25", "Информатика"],
    ["Борис", "30", "Математика"],
    ["Виктория", "22", "Физика"]
]

with open("студенты.csv", "w", encoding="utf-8") as файл:
    for строка in студенты:
        файл.write(",".join(строка) + "\n")

# Чтение CSV файла для проверки
with open("студенты.csv", "r", encoding="utf-8") as файл:
    print("Содержимое CSV файла:")
    for строка in файл:
        print(строка.strip())

# Более удобный способ с использованием модуля csv
import csv

with open("студенты2.csv", "w", encoding="utf-8", newline="") as файл:
    writer = csv.writer(файл)
    writer.writerows(студенты)

# Чтение с помощью csv.reader
with open("студенты2.csv", "r", encoding="utf-8") as файл:
    reader = csv.reader(файл)
    print("\nСодержимое CSV файла (с csv.reader):")
    for строка in reader:
        print(строка)
Запись JSON файлов
import json

# Данные для записи в JSON
данные = {
    "студенты": [
        {"имя": "Анна", "возраст": 25, "курс": "Информатика"},
        {"имя": "Борис", "возраст": 30, "курс": "Математика"},
        {"имя": "Виктория", "возраст": 22, "курс": "Физика"}
    ],
    "количество": 3
}

# Запись данных в JSON файл
with open("данные.json", "w", encoding="utf-8") as файл:
    json.dump(данные, файл, ensure_ascii=False, indent=2)

# Чтение JSON файла для проверки
with open("данные.json", "r", encoding="utf-8") as файл:
    прочитанные_данные = json.load(файл)
    print("Данные из JSON файла:")
    print(json.dumps(прочитанные_данные, ensure_ascii=False, indent=2))

# Запись списка в JSON
список = ["яблоко", "банан", "груша", "апельсин"]
with open("список.json", "w", encoding="utf-8") as файл:
    json.dump(список, файл, ensure_ascii=False, indent=2)

Работа с бинарными файлами

Для записи бинарных данных используется режим "wb":

Бинарные файлы
# Запись бинарных данных
данные = bytes([0, 1, 2, 3, 4, 5])

with open("бинарные_данные.bin", "wb") as файл:
    файл.write(данные)

# Чтение бинарных данных
with open("бинарные_данные.bin", "rb") as файл:
    прочитанные_данные = файл.read()
    print(f"Прочитанные данные: {прочитанные_данные}")

# Запись изображения (если есть файл)
# with open("исходное_изображение.png", "rb") as исходный:
#     with open("копия_изображения.png", "wb") as копия:
#         копия.write(исходный.read())

Практические примеры

Рассмотрим несколько практических примеров записи в файлы:

Логирование действий
import datetime

def записать_в_лог(сообщение, уровень="INFO"):
    # Формат времени
    время = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    # Запись в лог-файл
    with open("приложение.log", "a", encoding="utf-8") as файл:
        файл.write(f"[{время}] {уровень}: {сообщение}\n")

# Пример использования
записать_в_лог("Приложение запущено")
записать_в_лог("Пользователь вошел в систему", "INFO")
записать_в_лог("Низкий уровень памяти", "WARNING")
записать_в_лог("Ошибка подключения к базе данных", "ERROR")

# Чтение лог-файла
with open("приложение.log", "r", encoding="utf-8") as файл:
    print("Содержимое лог-файла:")
    print(файл.read())
Сохранение настроек приложения
import json

# Настройки приложения
настройки = {
    "тема": "светлая",
    "язык": "русский",
    "автосохранение": True,
    "интервал_автосохранения": 5,
    "последние_файлы": [
        "документ1.txt",
        "документ2.txt"
    ]
}

# Сохранение настроек
def сохранить_настройки(настройки, файл_настроек="настройки.json"):
    try:
        with open(файл_настроек, "w", encoding="utf-8") as файл:
            json.dump(настройки, файл, ensure_ascii=False, indent=2)
        print("Настройки успешно сохранены")
    except Exception as e:
        print(f"Ошибка при сохранении настроек: {e}")

# Загрузка настроек
def загрузить_настройки(файл_настроек="настройки.json"):
    try:
        with open(файл_настроек, "r", encoding="utf-8") as файл:
            return json.load(файл)
    except FileNotFoundError:
        print("Файл настроек не найден, используются настройки по умолчанию")
        return None
    except Exception as e:
        print(f"Ошибка при загрузке настроек: {e}")
        return None

# Сохранение настроек
сохранить_настройки(настройки)

# Загрузка и вывод настроек
загруженные_настройки = загрузить_настройки()
if загруженные_настройки:
    print("Загруженные настройки:")
    print(json.dumps(загруженные_настройки, ensure_ascii=False, indent=2))

Практические задания

Задания
  1. Создайте программу для ведения списка дел (todo-list) с возможностью сохранения в файл и загрузки из файла.
  2. Напишите функцию, которая сохраняет таблицу умножения в текстовый файл в формате таблицы.
  3. Создайте программу для записи и чтения контактов (имя, телефон, email) в CSV файл.
  4. Реализуйте функцию для создания резервной копии текстового файла с добавлением временной метки в имя файла.
Решения:

Задание 1:

import json
from datetime import datetime

class СписокДел:
    def __init__(self):
        self.дела = []
    
    def добавить_дело(self, описание):
        дело = {
            "описание": описание,
            "дата_создания": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "выполнено": False
        }
        self.дела.append(дело)
    
    def отметить_выполненным(self, индекс):
        if 0 <= индекс < len(self.дела):
            self.дела[индекс]["выполнено"] = True
    
    def показать_дела(self):
        for i, дело in enumerate(self.дела):
            статус = "✓" if дело["выполнено"] else "○"
            print(f"{i+1}. [{статус}] {дело['описание']} ({дело['дата_создания']})")
    
    def сохранить_в_файл(self, имя_файла="дела.json"):
        try:
            with open(имя_файла, "w", encoding="utf-8") as файл:
                json.dump(self.дела, файл, ensure_ascii=False, indent=2)
            print(f"Список дел сохранен в файл '{имя_файла}'")
        except Exception as e:
            print(f"Ошибка при сохранении: {e}")
    
    def загрузить_из_файла(self, имя_файла="дела.json"):
        try:
            with open(имя_файла, "r", encoding="utf-8") as файл:
                self.дела = json.load(файл)
            print(f"Список дел загружен из файла '{имя_файла}'")
        except FileNotFoundError:
            print("Файл не найден, создан новый список дел")
        except Exception as e:
            print(f"Ошибка при загрузке: {e}")

# Пример использования
список = СписокДел()

# Добавляем несколько дел
список.добавить_дело("Изучить Python")
список.добавить_дело("Сделать домашнее задание")
список.добавить_дело("Погулять")

# Отмечаем выполненным
список.отметить_выполненным(0)

# Показываем список
print("Текущий список дел:")
список.показать_дела()

# Сохраняем в файл
список.сохранить_в_файл()

# Создаем новый список и загружаем из файла
новый_список = СписокДел()
новый_список.загрузить_из_файла()
print("\nЗагруженный список дел:")
новый_список.показать_дела()

Задание 2:

def сохранить_таблицу_умножения(размер=10, имя_файла="таблица_умножения.txt"):
    try:
        with open(имя_файла, "w", encoding="utf-8") as файл:
            # Записываем заголовок
            заголовок = "   " + " ".join([f"{i:3}" for i in range(1, размер + 1)])
            файл.write(заголовок + "\n")
            файл.write("   " + "-" * (размер * 4 - 1) + "\n")
            
            # Записываем строки таблицы
            for i in range(1, размер + 1):
                строка = f"{i:2} |"
                for j in range(1, размер + 1):
                    строка += f"{i * j:3} "
                файл.write(строка + "\n")
        
        print(f"Таблица умножения сохранена в файл '{имя_файла}'")
    except Exception as e:
        print(f"Ошибка при сохранении: {e}")

# Создаем таблицу умножения 10x10
сохранить_таблицу_умножения(10)

# Читаем и выводим содержимое файла
with open("таблица_умножения.txt", "r", encoding="utf-8") as файл:
    print("Таблица умножения:")
    print(файл.read())

Задание 3:

import csv

class Контакты:
    def __init__(self, имя_файла="контакты.csv"):
        self.имя_файла = имя_файла
        self.заголовки = ["Имя", "Телефон", "Email"]
        self.создать_файл_если_нужно()
    
    def создать_файл_если_нужно(self):
        try:
            with open(self.имя_файла, "r", encoding="utf-8") as файл:
                pass  # Файл существует
        except FileNotFoundError:
            # Создаем файл с заголовками
            with open(self.имя_файла, "w", encoding="utf-8", newline="") as файл:
                writer = csv.writer(файл)
                writer.writerow(self.заголовки)
    
    def добавить_контакт(self, имя, телефон, email):
        try:
            with open(self.имя_файла, "a", encoding="utf-8", newline="") as файл:
                writer = csv.writer(файл)
                writer.writerow([имя, телефон, email])
            print(f"Контакт '{имя}' добавлен")
        except Exception as e:
            print(f"Ошибка при добавлении контакта: {e}")
    
    def показать_контакты(self):
        try:
            with open(self.имя_файла, "r", encoding="utf-8") as файл:
                reader = csv.reader(файл)
                контакты = list(reader)
                
                if not контакты:
                    print("Контакты не найдены")
                    return
                
                # Выводим заголовки
                print(f"{контакты[0][0]:<15} {контакты[0][1]:<15} {контакты[0][2]}")
                print("-" * 50)
                
                # Выводим контакты
                for контакт in контакты[1:]:
                    print(f"{контакт[0]:<15} {контакт[1]:<15} {контакт[2]}")
        except Exception as e:
            print(f"Ошибка при чтении контактов: {e}")

# Пример использования
контакты = Контакты()

# Добавляем несколько контактов
контакты.добавить_контакт("Анна", "+7(999)123-45-67", "anna@email.com")
контакты.добавить_контакт("Борис", "+7(999)765-43-21", "boris@email.com")
контакты.добавить_контакт("Виктория", "+7(999)555-55-55", "vika@email.com")

# Показываем все контакты
print("Список контактов:")
контакты.показать_контакты()

Задание 4:

import shutil
import datetime
import os

def создать_резервную_копию(исходный_файл):
    try:
        # Проверяем существование исходного файла
        if not os.path.exists(исходный_файл):
            print(f"Файл '{исходный_файл}' не найден!")
            return
        
        # Получаем имя файла без расширения и расширение
        имя, расширение = os.path.splitext(исходный_файл)
        
        # Создаем имя файла резервной копии с временной меткой
        временная_метка = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
        файл_резервной_копии = f"{имя}_backup_{временная_метка}{расширение}"
        
        # Создаем резервную копию
        shutil.copy2(исходный_файл, файл_резервной_копии)
        print(f"Резервная копия создана: '{файл_резервной_копии}'")
        
        return файл_резервной_копии
    except Exception as e:
        print(f"Ошибка при создании резервной копии: {e}")
        return None

# Создаем тестовый файл
with open("тестовый_файл.txt", "w", encoding="utf-8") as файл:
    файл.write("Это тестовый файл для резервного копирования.\n")
    файл.write("Создан для демонстрации работы функции.\n")

# Создаем резервную копию
резервная_копия = создать_резервную_копию("тестовый_файл.txt")

# Проверяем содержимое резервной копии
if резервная_копия and os.path.exists(резервная_копия):
    with open(резервная_копия, "r", encoding="utf-8") as файл:
        print(f"\nСодержимое резервной копии '{резервная_копия}':")
        print(файл.read())
Предыдущий урок Следующий урок