Форматирование содержимого: эффективные приёмы Python для файлового ввода-вывода

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

Основной метод: f-строки с контекстным менеджером

Для форматирования данных при записи в файл в Python наиболее эффективным и читаемым способом являются f-строки (f-strings), появившиеся в Python 3.6. Они позволяют встраивать выражения прямо в строковые литералы. В сочетании с менеджером контекста with open гарантируется корректное закрытие файла.

Пример:


name = 'Alice'
age = 30
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write(f'Name: {name}, Age: {age}\n')

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

Пояснение: f-строка начинается с префикса f, внутри фигурных скобок указываются переменные или выражения. Менеджер контекста автоматически закрывает файл после выполнения блока.

Возможные проблемы: если переменная не определена, возникает NameError. Также при записи в файл необходимо указывать кодировку (например, encoding='utf-8'), иначе могут возникнуть ошибки с символами не из ASCII.

Решение: всегда проверять наличие переменных перед использованием в f-строке, явно задавать кодировку.

Как использовать метод .format() для форматирования строк?

Метод .format() подходит для случаев, когда требуется совместимость с Python 3.5 и ниже, или когда форматная строка известна заранее, а значения подставляются позже. Он позволяет использовать нумерованные и именованные поля.


template = 'Name: {0}, Age: {1}\n'
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write(template.format('Bob', 25))

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

Ошибки: несоответствие количества аргументов может вызвать IndexError или KeyError.

Решение: проверять количество и имена полей в шаблоне.

Как использовать оператор % для форматирования?

Старый стиль форматирования с помощью оператора % (например, 'Name: %s, Age: %d' % (name, age)) до сих пор встречается в легаси-коде. Его не рекомендуется использовать в новых проектах из-за меньшей читаемости и ограниченных возможностей.


with open('output.txt', 'w', encoding='utf-8') as f:
    f.write('Name: %s, Age: %d\n' % ('Charlie', 35))

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

Проблема: неверный спецификатор типа (например, %d для строки) вызывает TypeError.

Решение: использовать только соответствующие типы.

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

Для данных в формате JSON (например, словарь) применяется модуль json. Функция json.dump() записывает данные в файл с автоматическим форматированием. Параметр indent задает отступы для читаемости.


import json
data = {'name': 'Diana', 'age': 28, 'hobbies': ['reading', 'coding']}
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, indent=4, ensure_ascii=False)

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

Ошибки: если данные содержат несериализуемые типы (например, datetime), возникает TypeError. Необходимо преобразовать их в строку или использовать специальный кодировщик.

Решение: определить собственный класс-кодировщик или преобразовать данные заранее.

Как форматировать табличные данные (CSV)?

Модуль csv позволяет записывать строки с разделителями. Создаётся объект csv.writer, который форматирует каждую строку в соответствии с настройками диалекта (разделитель, кавычки).


import csv
with open('data.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f, delimiter=',')
    writer.writerow(['Name', 'Age', 'City'])
    writer.writerow(['Eve', 22, 'Moscow'])
    writer.writerow(['Frank', 40, 'SPb'])

Проблемы: если данные содержат разделитель или кавычки, csv.writer автоматически экранирует. Однако при ручной записи можно получить некорректный CSV.

Решение: всегда использовать модуль csv для записи.

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

Расширенные примеры форматирования

Пример 1: Форматирование чисел с выравниванием и знаками

Код:

Пример

# Выравнивание вправо, влево, по центру
numbers = [1.5, 2.71828, 100.0]
with open('numbers.txt', 'w', encoding='utf-8') as f:
    for num in numbers:
        f.write(f'{num:>10.2f}\n')  # 10 символов, 2 знака после запятой, выравнивание вправо

Результат:

      1.50
      2.72
    100.00

Пояснение: спецификация :>10.2f задаёт ширину поля 10, выравнивание вправо (>), два знака после запятой.

Пример 2: Запись в JSON с сортировкой ключей и отступами

Код:

Пример

import json
data = {'z': 3, 'a': 1, 'b': 2}
with open('sorted.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, sort_keys=True, indent=2)

Результат (файл sorted.json):

{
  "a": 1,
  "b": 2,
  "z": 3
}

Пояснение: параметр sort_keys=True сортирует ключи по алфавиту, indent=2 добавляет отступы.

Пример 3: Чтение CSV и форматирование вывода в консоль

Код:

Пример

import csv
with open('data.csv', 'r', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(f'| {row[0]:10} | {row[1]:3} | {row[2]:10} |')

Результат (при наличии data.csv):

| Name       | Age | City       |
| Eve        |  22 | Moscow     |
| Frank      |  40 | SPb        |

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

Пример 4: Бинарное форматирование с помощью модуля struct

Для работы с бинарными файлами (например, заголовки изображений) используется модуль struct. Форматная строка задаёт порядок и типы полей.

Пример

import struct
packed = struct.pack('i 2s f', 42, b'ab', 3.14)
with open('binary.dat', 'wb') as f:
    f.write(packed)
# Чтение
with open('binary.dat', 'rb') as f:
    data = f.read()
    unpacked = struct.unpack('i 2s f', data)
    print(unpacked)  # (42, b'ab', 3.14)

Результат:

(42, b'ab', 3.140000104904175)

Пояснение: формат 'i 2s f' означает целое (4 байта), 2 байта строки, float (4 байта). Необходимо следить за совпадением чисел при упаковке и распаковке.

Пример 5: Форматирование дат в лог-файле

Код:

Пример

from datetime import datetime
log_entries = [
    ('INFO', 'Сервер запущен'),
    ('ERROR', 'Ошибка подключения'),
]
with open('app.log', 'w', encoding='utf-8') as f:
    for level, msg in log_entries:
        timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        f.write(f'{timestamp} [{level:5}] {msg}\n')

Результат (пример):

2025-03-25 14:30:00 [INFO] Сервер запущен
2025-03-25 14:30:01 [ERROR] Ошибка подключения

Пояснение: метод strftime форматирует дату, а f-строка подставляет её вместе с выровненным уровнем.

Форматирование файла Python - comments

En
Python format file (python)