Работа с файлами в Python

Работа с файлами - важная часть программирования. Python предоставляет удобные средства для чтения и записи файлов различного формата.

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

Открытие и закрытие файлов

Для работы с файлами используется функция open(). Важно всегда закрывать файлы после использования:

Открытие и закрытие файлов
# Открытие файла для чтения
файл = open("пример.txt", "r", encoding="utf-8")
# ... работа с файлом ...
файл.close()  # Важно закрыть файл!

# Более безопасный способ - использование with
with open("пример.txt", "r", encoding="utf-8") as файл:
    # ... работа с файлом ...
    содержимое = файл.read()
# Файл автоматически закрывается после выхода из блока with

# Режимы открытия файлов:
# "r"  - чтение (по умолчанию)
# "w"  - запись (создает новый файл или перезаписывает существующий)
# "a"  - добавление (добавляет в конец файла)
# "r+" - чтение и запись
# "b"  - бинарный режим (например, "rb", "wb")

Чтение всего содержимого файла

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

Чтение всего содержимого
# Создадим пример файла для демонстрации
with open("пример.txt", "w", encoding="utf-8") as файл:
    файл.write("Привет, мир!\n")
    файл.write("Это вторая строка.\n")
    файл.write("А это третья строка.\n")

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

# Чтение определенного количества символов
with open("пример.txt", "r", encoding="utf-8") as файл:
    часть = файл.read(10)  # Первые 10 символов
    print(f"Первые 10 символов: '{часть}'")

Построчное чтение файлов

Для работы с большими файлами удобно читать их построчно:

Построчное чтение
# Метод readline() - чтение одной строки
with open("пример.txt", "r", encoding="utf-8") as файл:
    первая_строка = файл.readline()
    вторая_строка = файл.readline()
    print(f"Первая строка: {первая_строка.strip()}")
    print(f"Вторая строка: {вторая_строка.strip()}")

# Метод readlines() - чтение всех строк в список
with open("пример.txt", "r", encoding="utf-8") as файл:
    строки = файл.readlines()
    print("Все строки в списке:")
    for i, строка in enumerate(строки, 1):
        print(f"{i}: {строка.strip()}")

# Итерация по файлу (самый эффективный способ)
with open("пример.txt", "r", encoding="utf-8") as файл:
    print("Итерация по строкам:")
    for номер, строка in enumerate(файл, 1):
        print(f"{номер}: {строка.strip()}")

Работа с различными типами файлов

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

Работа с CSV файлами
# Создание примера CSV файла
with open("данные.csv", "w", encoding="utf-8") as файл:
    файл.write("Имя,Возраст,Город\n")
    файл.write("Анна,25,Москва\n")
    файл.write("Борис,30,Санкт-Петербург\n")
    файл.write("Виктория,22,Казань\n")

# Чтение CSV файла
with open("данные.csv", "r", encoding="utf-8") as файл:
    # Пропускаем заголовок
    заголовок = файл.readline().strip()
    print(f"Заголовок: {заголовок}")
    
    # Читаем данные
    for строка in файл:
        данные = строка.strip().split(",")
        имя, возраст, город = данные
        print(f"{имя} ({возраст} лет) из {город}")
Работа с JSON файлами
import json

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

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 файла:")
    for студент in данные["студенты"]:
        print(f"- {студент['имя']}, {студент['возраст']} лет, {студент['курс']}")

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

Важно обрабатывать возможные ошибки при работе с файлами:

Обработка исключений
# Обработка FileNotFoundError
try:
    with open("несуществующий_файл.txt", "r", encoding="utf-8") as файл:
        содержимое = файл.read()
        print(содержимое)
except FileNotFoundError:
    print("Файл не найден!")

# Обработка UnicodeDecodeError
try:
    with open("пример.txt", "r", encoding="ascii") as файл:
        содержимое = файл.read()
        print(содержимое)
except UnicodeDecodeError:
    print("Ошибка кодировки файла!")

# Общая обработка ошибок
try:
    with open("пример.txt", "r", encoding="utf-8") as файл:
        содержимое = файл.read()
        print(содержимое)
except FileNotFoundError:
    print("Файл не найден!")
except PermissionError:
    print("Нет прав доступа к файлу!")
except Exception as e:
    print(f"Произошла ошибка: {e}")

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

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

Анализ текстового файла
# Создание текстового файла для анализа
with open("текст.txt", "w", encoding="utf-8") as файл:
    файл.write("Python - это мощный язык программирования.\n")
    файл.write("Он используется для веб-разработки, анализа данных и машинного обучения.\n")
    файл.write("Python имеет простой и понятный синтаксис.\n")
    файл.write("Многие компании выбирают Python для своих проектов.\n")

# Анализ текста
def анализ_текста(имя_файла):
    try:
        with open(имя_файла, "r", encoding="utf-8") as файл:
            строки = файл.readlines()
            
            # Подсчет статистики
            количество_строк = len(строки)
            количество_символов = sum(len(строка) for строка in строки)
            количество_слов = sum(len(строка.split()) for строка in строки)
            
            print(f"Статистика файла '{имя_файла}':")
            print(f"- Строк: {количество_строк}")
            print(f"- Слов: {количество_слов}")
            print(f"- Символов: {количество_символов}")
            
            # Поиск самых длинных строк
            максимальная_длина = max(len(строка.strip()) for строка in строки)
            длинные_строки = [строка.strip() for строка in строки if len(строка.strip()) == максимальная_длина]
            
            print(f"\nСамые длинные строки ({максимальная_длина} символов):")
            for строка in длинные_строки:
                print(f"- {строка}")
                
    except FileNotFoundError:
        print(f"Файл '{имя_файла}' не найден!")

# Вызов функции анализа
анализ_текста("текст.txt")

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

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

Задание 1:

# Создание файла с данными о студентах
with open("студенты.txt", "w", encoding="utf-8") as файл:
    файл.write("Анна 25 Информатика\n")
    файл.write("Борис 30 Математика\n")
    файл.write("Виктория 22 Физика\n")

# Чтение и вывод данных
def вывести_студентов(имя_файла):
    try:
        with open(имя_файла, "r", encoding="utf-8") as файл:
            print("Список студентов:")
            for строка in файл:
                данные = строка.strip().split()
                if len(данные) == 3:
                    имя, возраст, курс = данные
                    print(f"- {имя}, {возраст} лет, {курс}")
    except FileNotFoundError:
        print("Файл не найден!")

вывести_студентов("студенты.txt")

Задание 2:

def частота_слов(имя_файла):
    частота = {}
    try:
        with open(имя_файла, "r", encoding="utf-8") as файл:
            for строка in файл:
                слова = строка.strip().lower().split()
                for слово in слова:
                    # Удаляем знаки препинания
                    слово = ''.join(символ for символ in слово if символ.isalnum())
                    if слово:
                        частота[слово] = частота.get(слово, 0) + 1
        
        # Сортировка по частоте
        отсортированные = sorted(частота.items(), key=lambda x: x[1], reverse=True)
        return отсортированные
    except FileNotFoundError:
        print("Файл не найден!")
        return []

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

результат = частота_слов("тест.txt")
print("Частота слов:")
for слово, количество in результат[:5]:  # Первые 5 слов
    print(f"{слово}: {количество}")

Задание 3:

import os

def поиск_слова_в_файлах(директория, слово):
    результаты = []
    
    try:
        for имя_файла in os.listdir(директория):
            путь_к_файлу = os.path.join(директория, имя_файла)
            
            # Проверяем, что это файл (не директория)
            if os.path.isfile(путь_к_файлу):
                try:
                    with open(путь_к_файлу, "r", encoding="utf-8") as файл:
                        for номер_строки, строка in enumerate(файл, 1):
                            if слово.lower() in строка.lower():
                                результаты.append((имя_файла, номер_строки, строка.strip()))
                except UnicodeDecodeError:
                    # Пропускаем файлы, которые не могут быть прочитаны как текст
                    pass
                except PermissionError:
                    # Пропускаем файлы, к которым нет доступа
                    pass
                    
        return результаты
    except FileNotFoundError:
        print(f"Директория '{директория}' не найдена!")
        return []

# Пример использования (раскомментируйте для тестирования)
# результаты = поиск_слова_в_файлах(".", "Python")
# for файл, строка, содержимое in результаты:
#     print(f"{файл}:{строка} - {содержимое}")

Задание 4:

def анализ_лога(имя_файла):
    ошибки = 0
    предупреждения = 0
    
    try:
        with open(имя_файла, "r", encoding="utf-8") as файл:
            for строка in файл:
                if "ERROR" in строка:
                    ошибки += 1
                elif "WARNING" in строка:
                    предупреждения += 1
                    
        print(f"Анализ лог-файла '{имя_файла}':")
        print(f"- Ошибок (ERROR): {ошибки}")
        print(f"- Предупреждений (WARNING): {предупреждения}")
        print(f"- Всего проблем: {ошибки + предупреждения}")
        
    except FileNotFoundError:
        print(f"Лог-файл '{имя_файла}' не найден!")

# Создание примера лог-файла
with open("лог.txt", "w", encoding="utf-8") as файл:
    файл.write("2023-01-01 INFO Приложение запущено\n")
    файл.write("2023-01-01 WARNING Низкий уровень памяти\n")
    файл.write("2023-01-01 ERROR Не удалось подключиться к базе данных\n")
    файл.write("2023-01-01 INFO Пользователь вошел в систему\n")
    файл.write("2023-01-01 ERROR Ошибка доступа к файлу\n")
    файл.write("2023-01-01 WARNING Низкий уровень дискового пространства\n")

# Анализ лог-файла
анализ_лога("лог.txt")
Предыдущий урок Следующий урок