Файловый ввод-вывод: методы и примеры

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

Основы открытия файлов в Python

Самый надёжный и рекомендуемый способ - использование менеджера контекста with open(...) as f.

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

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

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

Цель использования: максимальная безопасность и читаемость кода. Подходит для любых сценариев.

Типичные ошибки:

  • Файл не существует - FileNotFoundError. Решение: проверять наличие файла через os.path.exists() или обрабатывать исключение.
  • Неправильная кодировка - UnicodeDecodeError. Решение: указывать правильный параметр encoding.

Как открыть файл без менеджера контекста?

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

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

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

Цель: понимание работы с файлами на низком уровне. В современном Python практически не используется.

Забытый вызов close() приводит к утечке файловых дескрипторов.

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

Режимы: 'r' (чтение, по умолчанию), 'w' (запись, перезапись), 'a' (добавление в конец), 'x' (исключающее создание, ошибка если файл существует).

# Чтение
with open('data.txt', 'r') as f:
    print(f.read())

# Запись (перезаписывает файл)
with open('output.txt', 'w') as f:
    f.write('Новый текст\n')

# Добавление
with open('log.txt', 'a') as f:
    f.write('Запись в конец\n')

# Исключающее создание
with open('new_file.txt', 'x') as f:
    f.write('Создано впервые')

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

Цель: выбор стратегии работы с файлом.

При использовании 'w' файл очищается. 'x' вызовет FileExistsError, если файл уже есть.

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

Параметр encoding обязателен при работе с текстовыми файлами, особенно в разных ОС. По умолчанию зависит от платформы.

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

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

Цель: избежать ошибок декодирования. Часто используется utf-8, cp1251, latin-1.

Если не указать кодировку, в Windows может использоваться cp1251, а в Linux - utf-8, что приводит к несовместимости.

Как открыть файл с помощью pathlib?

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

from pathlib import Path

path = Path('data.txt')
with path.open('r', encoding='utf-8') as f:
    lines = f.readlines()

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

Цель: единообразная работа с путями, кроссплатформенность.

Не все знают этот модуль, но он предпочтительнее os.path.

Как обработать исключения при открытии файла?

Обёртка в try/except позволяет обрабатывать ошибки.

try:
    with open('missing.txt', 'r') as f:
        content = f.read()
except FileNotFoundError:
    print('Файл не найден')
except PermissionError:
    print('Нет прав доступа')
except UnicodeDecodeError:
    print('Ошибка кодировки')

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

Цель: устойчивость программы к внешним ошибкам.

Без обработки программа аварийно завершится.

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

Методы: read() (весь файл), readline() (одна строка), readlines() (список строк), read(size) (кусок).

# Построчно через итерацию
with open('big_file.txt', 'r') as f:
    for line in f:
        process(line)  # какая-то обработка

# Чтение блока по 1024 байта
with open('file.bin', 'rb') as f:
    while chunk := f.read(1024):
        process(chunk)

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

Цель: экономия памяти при больших файлах.

read() без аргумента загружает весь файл в память; для больших файлов это может быть проблемой.

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

Методы write() и writelines() (не добавляет символы перевода строки).

lines = ['строка1\n', 'строка2\n', 'строка3\n']
with open('output.txt', 'w', encoding='utf-8') as f:
    f.writelines(lines)  # или циклом f.write(line)

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

Цель: массовая запись данных.

Забытый символ \n приведёт к слипанию строк.

Как открыть несколько файлов одновременно?

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

with open('in.txt', 'r') as f_in, open('out.txt', 'w') as f_out:
    for line in f_in:
        f_out.write(line.upper())

Цель: копирование, преобразование данных.

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

- File models in python (модели файлов в python)
- File handle python (обработка файлов в python)
- Python open file read (открытие файла для чтения в python)

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

Пример 1. Потоковое чтение большого файла с подсчётом строк

Пример
# large_file.txt (предполагается большой файл)
with open('large_file.txt', 'r', encoding='utf-8') as f:
    count = 0
    for line in f:
        count += 1
print(f'Всего строк: {count}')
Всего строк: 1000000

Пояснение: итерация по файловому объекту читает строки «лениво», не загружая весь файл в память.

Пример 2. Копирование бинарного файла (изображение) частями

Пример
BUFFER_SIZE = 4096
with open('source.jpg', 'rb') as src, open('dest.jpg', 'wb') as dst:
    while True:
        chunk = src.read(BUFFER_SIZE)
        if not chunk:
            break
        dst.write(chunk)
(файл скопирован, ошибок нет)

Пояснение: бинарный режим 'rb'/'wb' не использует кодировку. Буфер 4 КБ - разумный размер для многих сценариев.

Пример 3. Чтение файла с BOM (encoding='utf-8-sig')

Пример
# Файл с BOM (например, из Windows Notepad)
with open('bom_file.txt', 'r', encoding='utf-8-sig') as f:
    print(f.read())
Текст без BOM-символа

Пояснение: кодировка utf-8-sig автоматически удаляет префикс BOM (\ufeff).

Пример 4. Использование StringIO как файлового объекта

Пример
from io import StringIO

buffer = StringIO()
buffer.write('Временные данные\n')
buffer.write('Ещё строка')
buffer.seek(0)
print(buffer.read())
buffer.close()
Временные данные
Ещё строка

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

Пример 5. Чтение из stdin как файла

Пример
import sys
print('Введите текст (Ctrl+D для завершения):')
for line in sys.stdin:
    print(f'Вы ввели: {line.strip()}')
Введите текст (Ctrl+D для завершения):
Привет
Вы ввели: Привет

Пояснение: sys.stdin - файлоподобный объект, его можно использовать в цикле.

Пример 6. Временный файл через tempfile

Пример
import tempfile

with tempfile.NamedTemporaryFile(mode='w', delete=False) as tmp:
    tmp.write('Временные данные')
    tmp_path = tmp.name
print(f'Файл создан: {tmp_path}')
# Файл не удалён автоматически, так как delete=False
import os
os.remove(tmp_path)
Файл создан: /tmp/tmpabc123

Пояснение: tempfile создаёт уникальный временный файл. delete=False оставляет его после закрытия.

Пример 7. Многопоточное чтение одного файла (с блокировкой)

Пример
import threading

def read_line(file_path, line_num):
    with open(file_path, 'r') as f:
        for i, line in enumerate(f):
            if i == line_num:
                return line.strip()
    return None

# Использование потоков
threads = []
for num in [0, 10, 100]:
    t = threading.Thread(target=lambda: print(read_line('data.txt', num)))
    threads.append(t)
    t.start()
for t in threads:
    t.join()
Первая строка
Одиннадцатая строка
Сто первая строка

Пояснение: каждый поток открывает файл заново, поэтому нет конфликтов записи. Для конкурентной записи требуется блокировка.

Пример 8. Кастомный контекстный менеджер для файла

Пример
from contextlib import contextmanager

@contextmanager
def open_file(path, mode):
    f = open(path, mode)
    try:
        yield f
    finally:
        f.close()

with open_file('test.txt', 'w') as f:
    f.write('Собственный менеджер')
(файл записан и закрыт)

Пояснение: декоратор @contextmanager упрощает создание своих менеджеров контекста.

Открытие файла в Python - comments

En
Python open file (python)