Обработка файлов в Python: от простого к сложному

Раздел: Python -> Файловый ввод-вывод

Основные операции файлового ввода-вывода

Рекомендуемый способ: менеджер контекста with open

Для открытия файла применяется функция open(), которая возвращает файловый объект. Использование оператора with гарантирует, что файл будет закрыт после завершения блока, даже если произойдет ошибка.

with open('data.txt', 'r', encoding='utf-8') as f:\n    content = f.read()\nprint(content)

ввод программ на python (ввод данных в программе python)

Для записи:

with open('output.txt', 'w', encoding='utf-8') as f:\n    f.write('Python file I/O')

Python file io (ввод-вывод файлов в python)

Второй аргумент - режим: 'r' (чтение), 'w' (запись, перезаписывает), 'a' (добавление), 'x' (исключительное создание), 'b' (бинарный). Кодировку рекомендуется указывать явно.

Как прочитать файл целиком или частями?

Метод read() без аргументов считывает весь файл в строку. При большом размере файла это может привести к нехватке памяти. Для ограничения объёма передается число байт:

with open('large.txt', 'r', encoding='utf-8') as f:\n    chunk = f.read(1024)  # 1 КБ

Python temp files (временные файлы в python)

Метод readline() возвращает одну строку, включая символ перевода строки. readlines() возвращает список всех строк. Однако для больших файлов лучше применять итерацию по файловому объекту.

Проблема: при чтении файла без указания кодировки в Windows может использоваться системная кодировка (CP1251), что приведет к ошибкам UnicodeDecodeError для символов, не входящих в эту кодировку. Решение: всегда указывать encoding='utf-8'.

Как записать список строк в файл?

Метод writelines() принимает итерируемый объект (например, список строк) и записывает каждую строку. Символы перевода строки не добавляются автоматически:

lines = ['строка1\n', 'строка2\n', 'строка3\n']\nwith open('lines.txt', 'w', encoding='utf-8') as f:\n    f.writelines(lines)

Python index files (индексация файлов в python)

Если строки не содержат '\n', их нужно добавлять вручную или использовать join() перед записью.

Проблема: если файл уже существует, режим 'w' перезаписывает его без предупреждения. Для безопасного создания нового файла применяйте режим 'x' - он вызовет FileExistsError, если файл существует.

Как работать с бинарными файлами?

Для бинарных данных (изображения, аудио, сериализованные объекты) используется режим 'rb' или 'wb'. При чтении возвращаются объекты bytes, при записи нужно передавать bytes:

with open('image.jpg', 'rb') as f:\n    data = f.read()\nwith open('copy_image.jpg', 'wb') as f:\n    f.write(data)

File python class (класс для работы с файлами в python)

Для сериализации структур Python удобен модуль pickle:

import pickle\ndata = {'key': 'value'}\nwith open('data.pkl', 'wb') as f:\n    pickle.dump(data, f)\nwith open('data.pkl', 'rb') as f:\n    loaded = pickle.load(f)

Python file utf 8 (кодировка utf-8 для файлов в python)

Как обрабатывать ошибки при открытии файла?

При работе с файлами возможны исключения: FileNotFoundError (файл не существует), PermissionError (нет прав), OSError (другие ошибки ввода-вывода). Обработка с помощью try-except:

try:\n    with open('missing.txt', 'r') as f:\n        content = f.read()\nexcept FileNotFoundError:\n    print('Файл не найден')\nexcept PermissionError:\n    print('Нет доступа к файлу')\nexcept OSError as e:\n    print(f'Ошибка ввода-вывода: {e}')

Python config files (конфигурационные файлы в python)

Перед открытием можно проверить существование файла с помощью os.path.exists() или pathlib.Path.exists().

Как использовать современный модуль pathlib для работы с путями?

Модуль pathlib предоставляет объектно-ориентированный интерфейс для путей. Метод Path.open() работает как обычный open():

from pathlib import Path\npath = Path('data.txt')\nif path.exists():\n    with path.open('r', encoding='utf-8') as f:\n        content = f.read()\nelse:\n    print('Файл не найден')

Python copy file (копирование файла в python)

Path также имеет методы read_text() и write_text() для простого чтения/записи:

content = Path('data.txt').read_text(encoding='utf-8')\nPath('output.txt').write_text('Hello', encoding='utf-8')
- File models in python (модели файлов в python)
- File handle python (обработка файлов в python)
- Python open file read (открытие файла для чтения в python)

Расширенные примеры и нестандартные случаи

Пример
import shutil\nshutil.copy2('source.txt', 'dest.txt')

Результат:

Файл скопирован с сохранением метаданных (время создания и т.д.)
Пример
import tempfile\nwith tempfile.NamedTemporaryFile(mode='w', delete=False) as tmp:\n    tmp.write('временные данные')\n    tmp_name = tmp.name  # путь к временному файлу

Пояснение:

NamedTemporaryFile создает временный файл с уникальным именем. Параметр delete=False оставляет файл после закрытия.
Пример
import csv\nwith open('data.csv', 'r', newline='', encoding='utf-8') as f:\n    reader = csv.reader(f)\n    for row in reader:\n        print(row)

Вывод (пример):

['name', 'age']\n['Alice', '30']\n['Bob', '25']
Пример
import mmap\nwith open('bigfile.bin', 'r+b') as f:\n    with mmap.mmap(f.fileno(), 0) as mm:\n        data = mm[:100]  # первые 100 байт

Объяснение:

mmap позволяет отобразить файл в память, что ускоряет доступ к большим файлам, не загружая их целиком.
Пример
with open('file_cp1251.txt', 'w', encoding='cp1251') as f:\n    f.write('Текст в кодировке Windows-1251')

Результат:

Файл создан в кодировке CP1251. При чтении без указания кодировки может возникнуть UnicodeDecodeError.
Пример
with open('huge.txt', 'r', buffering=8192) as f:\n    for line in f:\n        pass

Пояснение:

Параметр buffering задает размер буфера в байтах. По умолчанию используется системный буфер. Настройка может повлиять на производительность.
Пример
with open('example.txt', 'r+', encoding='utf-8') as f:\n    content = f.read()\n    f.seek(0)\n    f.write('Новый текст')

Предупреждение:

При использовании 'r+' нужно быть осторожным: запись может затереть данные, если не переместить указатель правильно.

Ввод-вывод файлов в Python - comments

En
Python file io (python)