Python файловый ввод-вывод: от основ до продвинутых примеров

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

Основы работы с файловыми потоками в Python

Центральный элемент работы с файлами в Python - функция open() и менеджер контекста with. Этот способ гарантирует закрытие файла после завершения блока, предотвращая утечку ресурсов. Пример открытия текстового файла для чтения:

with open('example.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)

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

Для записи используется режим 'w' (создаёт или перезаписывает файл) или 'a' (добавляет данные в конец):

with open('output.txt', 'w', encoding='utf-8') as file:
    file.write('Первая строка\nВторая строка')

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

Такой подход решает большинство задач файлового ввода-вывода и является рекомендуемым.

Альтернативные способы и частные случаи

Как прочитать файл целиком в одну строку?

Используйте метод read() без аргументов. Он возвращает весь текст как одну строку. Проблема: для больших файлов (гигабайты) это может переполнить оперативную память. Решение - читать частями или построчно.

with open('data.txt', 'r') as f:
    data = f.read()
    print(len(data))

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

Как обработать файл построчно без загрузки всего в память?

Итерация по объекту файла. Файл является итератором, возвращающим строки по одной. Эффективно для логов и больших файлов.

with open('big.log', 'r') as f:
    for line in f:
        if 'ERROR' in line:
            print(line.strip())

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

Метод readline() также читает одну строку, но чаще используется в цикле с явным условием.

Как дописать данные в конец существующего файла?

Режим 'a' (append). Файл открывается на запись, курсор устанавливается в конец. Если файла нет, он создаётся.

with open('log.txt', 'a', encoding='utf-8') as f:
    f.write(f'{datetime.now()}: новое событие\n')

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

Как работать с бинарными файлами (изображения, архивы)?

Добавьте 'b' к режиму: 'rb', 'wb', 'ab'. Данные читаются и записываются как объекты bytes. Кодировка не указывается.

with open('photo.jpg', 'rb') as src:
    with open('copy.jpg', 'wb') as dst:
        dst.write(src.read())

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

Как правильно указать кодировку при открытии файла?

Параметр encoding в open(). По умолчанию используется системная, что может вызвать ошибки. Рекомендуется явно указывать 'utf-8' для текстовых файлов.

with open('file.txt', 'r', encoding='utf-8') as f:
    content = f.read()

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

Как переместить позицию чтения/записи внутри файла?

Методы seek() и tell(). seek(offset, whence) устанавливает курсор, tell() возвращает текущую позицию. Полезно для чтения определённых фрагментов.

with open('data.bin', 'rb') as f:
    f.seek(1024)  # перейти к байту 1024
    chunk = f.read(512)
    print(f.tell())

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

Как обработать ошибки открытия файла (файл не найден, нет прав)?

Используйте try-except. Исключения: FileNotFoundError, PermissionError, общее OSError.

try:
    with open('missing.txt', 'r') as f:
        data = f.read()
except FileNotFoundError:
    print('Файл не найден')
except PermissionError:
    print('Нет прав на чтение')

Типичные проблемы и их решение

  • Забытый close() при использовании open() без with - ручной вызов f.close() обязателен, иначе возможна потеря данных. Решение: всегда использовать контекстный менеджер.
  • Ошибка UnicodeDecodeError при чтении текстового файла - неподходящая кодировка. Решение: указать правильную кодировку, например encoding='cp1251' для русской Windows.
  • Перетирание данных при записи в режиме 'w' - файл очищается. Решение: использовать 'a' для добавления или проверять существование файла.
  • Проблемы с большими файлами - чтение всего файла в память. Решение: читать порциями (read(size)) или построчно.
  • Некорректная работа с бинарными и текстовыми режимами - не смешивать 'b' с кодировкой. Решение: для текста не добавлять 'b', для бинарного - не указывать encoding.
- File models in python (модели файлов в python)
- File handle python (обработка файлов в python)
- Python open file read (открытие файла для чтения в python)

Расширенные примеры работы с файловыми потоками

Менеджер контекста с несколькими файлами

Одновременное чтение из одного файла и запись в другой. Позволяет безопасно копировать данные.

Пример
with open('source.txt', 'r', encoding='utf-8') as src, open('dest.txt', 'w', encoding='utf-8') as dst:
    for line in src:
        dst.write(line.upper())
Результат: файл dest.txt содержит те же строки в верхнем регистре.

Побитовое чтение больших бинарных файлов (копирование поблочно)

Избегает загрузки всего файла в память. Размер блока (4 КБ) оптимален для производительности.

Пример
BLOCK_SIZE = 4096
with open('large_video.mp4', 'rb') as src, open('video_backup.mp4', 'wb') as dst:
    while True:
        block = src.read(BLOCK_SIZE)
        if not block:
            break
        dst.write(block)
Файл video_backup.mp4 является точной копией исходного.

Использование StringIO для работы со строками как с файлами

Модуль io.StringIO позволяет создать файлоподобный объект в памяти. Полезен для тестирования или обработки строк.

Пример
from io import StringIO

buffer = StringIO()
buffer.write('Строка 1\n')
buffer.write('Строка 2\n')
print('Содержимое буфера:')
buffer.seek(0)
print(buffer.read())  # выведет обе строки
buffer.close()
Содержимое буфера:
Строка 1
Строка 2

Частичное чтение с помощью read(n) и позиционирование

Чтение первых 100 символов текстового файла, затем пропуск 50 символов и чтение ещё 100.

Пример
with open('data.txt', 'r', encoding='utf-8') as f:
    first_chunk = f.read(100)
    position = f.tell()
    print(f'Прочитано 100 символов, позиция {position}')
    f.seek(50, 1)  # пропустить 50 символов от текущей
    second_chunk = f.read(100)
    print('Первый кусок:', repr(first_chunk))
    print('Второй кусок:', repr(second_chunk))
Прочитано 100 символов, позиция 100
Первый кусок: '...' (первые 100 символов)
Второй кусок: '...' (следующие 100 после пропуска)

Обработка ошибок при записи с сохранением данных

Использование временного файла для атомарной замены. В случае ошибки исходный файл не повреждается.

Пример
import os

temp_file = 'output.tmp'
try:
    with open(temp_file, 'w', encoding='utf-8') as f:
        f.write('важные данные')
    os.replace(temp_file, 'output.txt')
except Exception as e:
    # удаляем временный файл при ошибке
    if os.path.exists(temp_file):
        os.remove(temp_file)
    print(f'Ошибка: {e}')
После успешного выполнения файл output.txt содержит 'важные данные'. При ошибке временный файл удалён.

Применение pathlib для управления путями и потоками

Класс Path предоставляет методы read_text(), write_text() и open(). Упрощает код.

Пример
from pathlib import Path

path = Path('example.txt')
# запись
path.write_text('Привет, мир!', encoding='utf-8')
# чтение
content = path.read_text(encoding='utf-8')
print(content)  # Привет, мир!

# работа с потоком
with path.open('r', encoding='utf-8') as f:
    for line in f:
        print(line)
Привет, мир!
Привет, мир!

Использование аргумента newline для контроля перевода строк

При записи текстовых файлов параметр newline='' отключает автоматическую трансляцию переводов строк. Полезно для кросс-платформенной совместимости.

Пример
with open('unix.txt', 'w', newline='\n', encoding='utf-8') as f:
    f.write('строка1\nстрока2')
# в файле будут только символы LF

Аналогично при чтении newline=None (по умолчанию) включает универсальный режим.

Файловые потоки в Python - comments

En
Python file stream (python)