Файловый ввод-вывод в Python: open, close, read, write и не только

Раздел: Ввод-вывод и файловая система -> Файловый ввод-вывод

Функции для работы с файлами в Python: open, close, read, write

Работа с файлами – неотъемлемая часть многих программ. Python предоставляет базовые функции open(), close(), read(), write() и их модификации. В этой статье рассмотрены различные подходы, начиная от самого надёжного и заканчивая альтернативными, с указанием типичных ошибок и способов их избежать.

Как гарантированно закрыть файл после работы, даже при возникновении исключения?

Самый надёжный способ – использование менеджера контекста with в сочетании с open(). Он автоматически вызывает close() при выходе из блока, независимо от того, произошла ошибка или нет.


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

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

Код открывает файл example.txt в режиме чтения ('r') с указанием кодировки. Переменная f – файловый объект. Метод read() считывает всё содержимое. После завершения блока with файл закрывается автоматически.

Типичная ошибка: забыть закрыть файл при использовании open() без контекстного менеджера. Это может привести к утечкам ресурсов, особенно в длительных программах. Использование with полностью решает эту проблему.

Основное назначение – безопасная и краткая запись для большинства задач ввода-вывода.

Как явно закрыть файл, если по каким-то причинам нельзя использовать with?

Можно использовать традиционный подход: open() + close() в паре с конструкцией try/finally.


try:
    f = open('data.txt', 'r', encoding='utf-8')
    data = f.read()
finally:
    f.close()
print(data)
  

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

Блок finally выполняется в любом случае, гарантируя вызов close(). Такой код эквивалентен менеджеру контекста, но более громоздок. Используется в коде, где требуется дополнительная обработка ошибок до закрытия, или при работе со старыми версиями Python (до 2.5).

Проблема: если забыть блок finally, файл может остаться открытым. Рекомендуется всегда использовать with.

Как читать большие файлы, не загружая их целиком в память?

Для больших файлов вместо read() следует использовать readline() или построчный итератор.


with open('huge_file.log', 'r', encoding='utf-8') as f:
    for line in f:
        # обрабатываем каждую строку
        if 'error' in line:
            print(line.strip())
  

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

Цикл for line in f внутренне использует буферизированное чтение и не загружает весь файл. Это эффективно для гигабайтных логов.

Ошибка: при вызове read() на большом файле может возникнуть MemoryError. Использование построчной обработки решает проблему.

Как записать список строк в файл без лишних пробелов?

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


lines = ['Первая строка\n', 'Вторая строка\n', 'Третья строка']
with open('output.txt', 'w', encoding='utf-8') as f:
    f.writelines(lines)
  

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

Важно, чтобы строки уже содержали символ \n, иначе они будут слиты. Если нужно добавить свои разделители, проще использовать цикл с write().

Распространённая ошибка: предполагать, что writelines() автоматически добавляет конец строки. На самом деле это не так.

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

Для бинарных файлов добавляется модификатор 'b' к режиму: 'rb', 'wb' и т.д. Данные считываются как объект bytes.


with open('image.jpg', 'rb') as src, open('copy.jpg', 'wb') as dst:
    chunk = src.read(4096)
    while chunk:
        dst.write(chunk)
        chunk = src.read(4096)
  

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

Копирование изображения частями по 4 КБ. Менеджер контекста позволяет открыть сразу два файла.

Ошибка: открытие бинарного файла в текстовом режиме ('r') приведёт к искажению данных (особенно под Windows, где символы конца строки преобразуются). Всегда используйте 'b' для нетекстовых данных.

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

Режим 'x' (исключительное создание) открывает файл для записи, если он не существует. Иначе выбрасывается исключение FileExistsError.


try:
    with open('new_file.txt', 'x', encoding='utf-8') as f:
        f.write('Создано впервые')
except FileExistsError:
    print('Файл уже существует, операция отменена.')
  

Полезно для защиты от случайной перезаписи.

Каждый из описанных подходов применим в зависимости от конкретной задачи: менеджер контекста – универсальный стандарт, явное закрытие – для совместимости, построчное чтение – для больших данных, бинарный режим – для нетекстовых файлов, режим 'x' – для безопасного создания.

- Python copy file (копирование файла в python)
- Python log file (логирование в файл в python)
- Python file methods (методы работы с файлами в python)

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

Полное копирование текстового файла с заменой регистра строк

Пример

with open('source.txt', 'r', encoding='utf-8') as src, open('dest.txt', 'w', encoding='utf-8') as dst:
    for i, line in enumerate(src, 1):
        if i % 2 == 0:
            dst.write(line.upper())
        else:
            dst.write(line.lower())
print('Копирование выполнено. Чётные строки в верхнем регистре, нечётные – в нижнем.')
Файл source.txt:
Первая строка
Вторая строка
Третья строка

Результат dest.txt:
первая строка
ВТОРАЯ СТРОКА
третья строка

Чтение бинарного файла и запись в формате hexdump

Пример

with open('image.png', 'rb') as f:
    data = f.read()
with open('hexdump.txt', 'w', encoding='utf-8') as out:
    for i, byte in enumerate(data):
        if i % 16 == 0 and i != 0:
            out.write('\n')
        out.write(f'{byte:02x} ')
print('Шестнадцатеричный дамп сохранён в hexdump.txt')
Фрагмент hexdump.txt для маленького PNG:
89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 
...

Использование seek и tell для позиционирования в файле

Пример

with open('test.txt', 'w+', encoding='utf-8') as f:
    f.write('0123456789')
    f.seek(5)            # перемещаем указатель на байт 5
    print(f'tell: {f.tell()}')  # текущая позиция
    f.write('A')         # замена символа в позиции 5
    f.seek(0)
    result = f.read()
print(result)
tell: 5
01234A6789

Запись и чтение структурированных данных с помощью pickle

Пример

import pickle
data = {'name': 'Alice', 'scores': [95, 87, 91]}

with open('person.pkl', 'wb') as f:
    pickle.dump(data, f)

with open('person.pkl', 'rb') as f:
    loaded = pickle.load(f)
print(loaded)
{'name': 'Alice', 'scores': [95, 87, 91]}

Обработка нескольких файлов с использованием glob

Пример

import glob

for filename in glob.glob('logs/*.log'):
    with open(filename, 'r', encoding='utf-8') as f:
        content = f.read()
        if 'ERROR' in content:
            print(f'Ошибка найдена в {filename}')
Ошибка найдена в logs/error.log
Ошибка найдена в logs/server.log

Временные файлы с модулем tempfile

Пример

import tempfile

with tempfile.NamedTemporaryFile(mode='w', delete=False, encoding='utf-8') as temp:
    temp.write('Временные данные')
    temp_path = temp.name
print(f'Временный файл создан: {temp_path}')

# Чтение этого же файла
with open(temp_path, 'r', encoding='utf-8') as f:
    print(f.read())
import os
os.unlink(temp_path)  # удаление файла
Временный файл создан: /tmp/tmpXXXXXX
Временные данные

Функции для работы с файлами в Python (open, close, read, write) - comments

En
функции file python (python)