Работа с текстовыми файлами на языке Python (файловый ввод-вывод)

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

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

Файловый ввод-вывод - одна из базовых операций при разработке на Python. Текстовые файлы (с расширением .txt) используются для хранения логов, конфигураций, вывода результатов и многого другого. Встроенные средства языка позволяют выполнять чтение, запись и изменение содержимого файлов с минимальными усилиями. В этой статье рассмотрены разные подходы, начиная от простых операций и заканчивая продвинутыми приёмами.

Основное решение: менеджер контекста with и кодировка UTF-8

Наиболее правильный и безопасный способ работы с текстовыми файлами - использование конструкции with open(...) as file:. Она гарантирует закрытие файла даже при возникновении исключения. Для кодировки по умолчанию в современных системах выбирается UTF-8, но её можно указать явно.


# Запись текста в файл
with open('example.txt', 'w', encoding='utf-8') as f:
    f.write('Привет, мир!')

# Чтение файла
with open('example.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print(content)

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

В примере выше создаётся файл (если его нет) и записывается строка. Затем файл открывается на чтение и содержимое выводится. Менеджер контекста автоматически вызывает f.close().

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

  • Забыть указать кодировку - на Windows по умолчанию может быть cp1251, что приведёт к искажению букв.
  • Открыть файл в режиме 'w' вместо 'a' - старые данные будут удалены.
  • Не проверять существование файла - исключение FileNotFoundError.

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

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


with open('data.txt', 'r', encoding='utf-8') as f:
    data = f.read()
    print(f'Символов в файле: {len(data)}')

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

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

Метод readlines() возвращает список строк (включая символы перевода строки). Файл считывается целиком.


with open('lines.txt', 'r') as f:
    lines = f.readlines()
    for line in lines:
        print(line.strip())  # убираем лишние пробелы и переносы

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

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

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


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

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

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

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


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

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

Как работать с текстовыми файлами в других кодировках (например, cp1251)?

Указать параметр encoding при открытии файла. При несовпадении кодировки возникает UnicodeDecodeError.


with open('data_cp1251.txt', 'r', encoding='cp1251') as f:
    text = f.read()
with open('data_utf8.txt', 'w', encoding='utf-8') as f:
    f.write(text)

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

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

Использовать конструкцию try-except для обработки исключений.


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

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

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

Итерация по файлу в цикле for line in f: считывает строки из буфера по одной, не загружая весь файл.


with open('huge_file.txt', 'r', encoding='utf-8') as f:
    for line_num, line in enumerate(f, 1):
        if 'ошибка' in line.lower():
            print(f'Строка {line_num}: {line.strip()}')

Проблемы и их решения

  • UnicodeDecodeError - неверная кодировка. Решение: указать правильную кодировку или открыть в бинарном режиме и декодировать вручную.
  • FileNotFoundError - файл не существует. Решение: проверить путь или создать файл заранее.
  • PermissionError - недостаточно прав. Решение: запустить скрипт с соответствующими правами или изменить атрибуты файла.
  • MemoryError - попытка прочитать слишком большой файл целиком. Решение: использовать построчное чтение.
- Python file methods (методы работы с файлами в python)
- File models in python (модели файлов в python)
- File handle python (обработка файлов в python)

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

Представлены нестандартные сценарии, которые помогут углубить понимание файлового ввода-вывода.

Чтение с пропуском заголовка

Если первая строка файла содержит заголовок, её можно пропустить вызовом next(f) до начала цикла.

Пример

with open('data.csv', 'r', encoding='utf-8') as f:
    header = next(f).strip()
    print('Заголовок:', header)
    for line in f:
        parts = line.strip().split(',')
        print('Данные:', parts)
Заголовок: Имя,Возраст,Город
Данные: ['Анна', '25', 'Москва']
Данные: ['Иван', '30', 'СПб']

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

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

Пример

with open('example.txt', 'w') as f:
    f.write('0123456789')

with open('example.txt', 'r') as f:
    print('Начало:', f.tell())      # 0
    chunk = f.read(5)
    print(chunk)                    # 01234
    print('После чтения 5:', f.tell())  # 5
    f.seek(0)  # перейти в начало
    print('После seek(0):', f.read())   # 0123456789
Начало: 0
01234
После чтения 5: 5
После seek(0): 0123456789

Работа с временными файлами (tempfile)

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

Пример

import tempfile

with tempfile.NamedTemporaryFile(mode='w', encoding='utf-8', delete=False) as f:
    f.write('Временные данные')
    filename = f.name
print('Имя временного файла:', filename)
with open(filename, 'r') as f:
    print(f.read())
# Файл не удалён из-за delete=False, его нужно удалить вручную
import os
os.remove(filename)
Имя временного файла: /tmp/tmpABCDEF
Временные данные

Запись с форматированием (f-строки)

Использование f-строк упрощает формирование строк для записи.

Пример

name = 'Мария'
age = 28
with open('person.txt', 'w', encoding='utf-8') as f:
    f.write(f'Имя: {name}\nВозраст: {age}\n')
with open('person.txt', 'r') as f:
    print(f.read())
Имя: Мария
Возраст: 28

Обработка файлов с BOM (Byte Order Mark)

Некоторые редакторы добавляют BOM в начало UTF-8 файла (utf-8-sig). При открытии с указанием encoding='utf-8-sig' BOM будет проигнорирован.

Пример

with open('utf8_bom.txt', 'w', encoding='utf-8-sig') as f:
    f.write('Текст с BOM')
with open('utf8_bom.txt', 'rb') as f:
    raw = f.read()
    print('Первые 3 байта (BOM):', raw[:3])
with open('utf8_bom.txt', 'r', encoding='utf-8-sig') as f:
    print('Без BOM:', f.read())
Первые 3 байта (BOM): b'\xef\xbb\xbf'
Без BOM: Текст с BOM

Параллельное чтение-запись в один файл (режимы r+ и w+)

Режим 'r+' открывает файл для чтения и записи, но не усекает его. 'w+' усекает сначала. Важно синхронизировать позицию после записи, чтобы прочитать обновлённые данные.

Пример

with open('rw_example.txt', 'w') as f:
    f.write('0123456789')

with open('rw_example.txt', 'r+') as f:
    print('Исходное содержимое:', f.read())
    f.seek(0)  # вернуться в начало
    f.write('ABCD')
    f.seek(0)
    print('После записи:', f.read())
Исходное содержимое: 0123456789
После записи: ABCD456789

Обратите внимание: символы ABCD заменили первые 4 символа, остальные остались без изменений. Чтобы перезаписать всё, нужно усечь остаток с помощью f.truncate().

Чтение файла с помощью Path (модуль pathlib)

Современный объектно-ориентированный подход предлагает класс Path.

Пример

from pathlib import Path

path = Path('hello.txt')
path.write_text('Привет из Path!', encoding='utf-8')
content = path.read_text(encoding='utf-8')
print(content)
Привет из Path!

Буферизированное чтение с заданным размером

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

Пример

with open('large.txt', 'r', encoding='utf-8') as f:
    while True:
        chunk = f.read(1024)  # 1 КБ
        if not chunk:
            break
        # обработка chunk
        print('Прочитано байт (символов):', len(chunk))
Прочитано байт (символов): 1024
Прочитано байт (символов): 1024
Прочитано байт (символов): 512

Текстовый файл в Python - comments

En
Python txt file (python)