Работа с файлами в Python: все методы и приёмы

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

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

Самым надёжным и рекомендуемым способом работы с файлами является использование контекстного менеджера with совместно с функцией open(). Этот подход гарантирует автоматическое закрытие файла даже при возникновении исключений, что предотвращает утечку ресурсов.


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

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

В примере открывается файл в режиме чтения ('r') с явным указанием кодировки. Метод read() считывает всё содержимое в строку. После выхода из блока with файл автоматически закрывается.

Типичная ошибка:

  • Забыть указать кодировку - в Windows может быть использована cp1251, что приводит к искажению текста. Всегда указывайте encoding='utf-8'.
  • Попытка повторного чтения после закрытия контекста - вызовет ValueError.

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


f = open('data.txt', 'r')
try:
    text = f.read()
finally:
    f.close()
  

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

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

Если не закрыть файл вручную, он остаётся открытым до завершения программы, что может привести к превышению лимита открытых файлов (OSError: [Errno 24] Too many open files).

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


with open('large.log', 'r', encoding='utf-8') as f:
    for line in f:
        print(line.strip())
  

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

Файловый объект является итератором, поэтому цикл for читает строку за строкой, не загружая весь файл в память. Это оптимально для больших файлов.

Если файл сотни мегабайт, использование readlines() сразу загрузит все строки в список, что вызовет переполнение памяти. Цикл по объекту - правильный выбор.

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


with open('output.txt', 'w', encoding='utf-8') as f:
    f.write('Строка данных\n')
    f.writelines(['вторая строка\n', 'третья строка\n'])
  

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

Режим 'w' создаёт новый файл или усекает существующий. write() записывает одну строку, writelines() - список строк (строки не добавляют символ новой строки автоматически).

Ошибка: забыть "\n" в конце строки - тогда дальнейшие записи склеятся с предыдущими. Кроме того, запись в несуществующий каталог вызовет FileNotFoundError.

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


with open('log.txt', 'a', encoding='utf-8') as f:
    f.write('Новая запись\n')
  

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

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

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

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


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

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

Для бинарных данных используются режимы 'rb' и 'wb'. Кодировка не указывается - данные читаются как bytes. Копирование целиком просто, но для очень больших файлов лучше читать порциями.


CHUNK = 1024 * 1024  # 1 MB
with open('large.bin', 'rb') as src, open('dest.bin', 'wb') as dst:
    while chunk := src.read(CHUNK):
        dst.write(chunk)
  

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

Оператор walrus (:=) читает порцию до тех пор, пока не вернётся пустой байт (конец файла).

При работе с бинарными файлами нельзя использовать текстовые методы (например, splitlines()), так как данные не являются строками.

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


with open('data.txt', 'r+') as f:
    f.write('ABC')
    pos = f.tell()       # вернёт 3
    f.seek(0)            # переместиться в начало
    print(f.read())      # выведет 'ABC'
  

tell() возвращает текущую позицию в байтах. seek(offset, whence) перемещает курсор. По умолчанию whence=0 (от начала), 1 - от текущей, 2 - от конца (offset часто отрицательный).

В текстовых режимах (t) seek ограничен - можно использовать только seek(0) и seek(0, 2) из-за кодировок переменной длины. Для произвольного доступа используйте бинарный режим.

- Python file methods (методы работы с файлами в python)
- File models in python (модели файлов в python)
- File handle python (обработка файлов в python)

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

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

Пример

def process_line(line):
    return line.upper()

with open('huge.txt', 'r') as fin, open('huge_upper.txt', 'w') as fout:
    for line in fin:
        fout.write(process_line(line))
Результат: создаётся новый файл с преобразованными строками. Память расходуется только на одну строку.

Использование модуля tempfile для временных файлов

Пример

import tempfile

with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as tmp:
    tmp.write('Временные данные')
    tmp_name = tmp.name
print(f'Временный файл создан: {tmp_name}')
# Файл не удалён, так как delete=False

Полезно для хранения промежуточных результатов, не засоряя файловую систему.

Работа с разными кодировками и обработка ошибок

Пример

import codecs

try:
    with open('text.txt', 'r', encoding='cp1251') as f:
        content = f.read()
except UnicodeDecodeError:
    # Файл не в cp1251, пробуем другую кодировку
    with open('text.txt', 'r', encoding='utf-8', errors='replace') as f:
        content = f.read()
Текст будет прочитан, нечитаемые символы заменены на � (при errors='replace').

Произвольный доступ к бинарным данным (структуры)

Пример

import struct

with open('records.bin', 'rb') as f:
    f.seek(10 * 20)  # пропустить 10 записей по 20 байт
    data = f.read(4)  # считать int32
    value = struct.unpack('I', data)[0]
    print(value)

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

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

Пример

import mmap

with open('data.bin', 'r+b') as f:
    # mmap создаёт отображение размером 0 (весь файл)
    with mmap.mmap(f.fileno(), 0) as mm:
        print(mm[:10])          # первые 10 байт
        mm[0:5] = b'HELLO'     # изменение содержимого на месте

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

Обработка исключений при работе с файлами

Пример

try:
    with open('config.cfg', 'r') as f:
        config = f.read()
except FileNotFoundError:
    print('Файл не найден. Будет использована конфигурация по умолчанию.')
except PermissionError:
    print('Нет прав на чтение файла.')
except IOError as e:
    print(f'Ошибка ввода-вывода: {e}')

Всегда обрабатывайте специфичные исключения, чтобы программа не падала неожиданно.

Методы работы с файлами в Python - comments

En
Python file methods (python)