Функции вывода в Python: когда использовать print, а когда write

Раздел: Функции -> Различия функций вывода

Основное различие между print и write

Эффективное решение: использование write для точного контроля вывода

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


import sys
sys.stdout.write("Текст без переноса")
sys.stdout.write(" на той же строке.\n")

Python print write (сравнение print и write в python)

Текст без переноса на той же строке.

Типичная ошибка: забыть добавить \n в конце строки при использовании write. В результате вывод может склеиваться с последующими данными. Решение: явно добавлять символ новой строки, если он требуется.

Как сделать вывод без автоматического перевода строки?

Существует несколько способов. Основные из них:

  1. Параметр end функции print.
  2. Метод write файлового объекта.
  3. Использование буферизированного вывода с sys.stdout.write.

# Вариант 1: print с end=''
print("Первая часть", end='')
print("Вторая часть", end='')
print()  # перевод строки вручную
Первая частьВторая часть

# Вариант 2: write
import sys
sys.stdout.write("Первая часть")
sys.stdout.write("Вторая часть\n")
Первая частьВторая часть

Возможные проблемы: при использовании write нужно следить за типами данных - write ожидает строку, а не другие объекты. Для вывода чисел требуется их преобразование в строку. Также print автоматически вызывает __str__ для объектов.

Как ускорить запись в файл большого объёма данных?

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


# Медленный способ через print
with open('output.txt', 'w') as f:
    for i in range(10000):
        print(f'Строка номер {i}', file=f)

# Быстрый способ через write
with open('output.txt', 'w') as f:
    lines = [f'Строка номер {i}\n' for i in range(10000)]
    f.writelines(lines)  # эффективнее, чем write в цикле

Ошибка: использование write в цикле с каждой итерацией может замедлить работу из-за частых вызовов. Решение: накапливать данные в списке и записывать за один раз через writelines.

Как выводить сообщения в поток ошибок?

Функция print позволяет указать file=sys.stderr. Метод write применяется к sys.stderr напрямую.


# print в stderr
import sys
print("Ошибка: что-то пошло не так", file=sys.stderr)

# write в stderr
sys.stderr.write("Ошибка: что-то пошло не так\n")

Типичная ошибка: забыть добавить перевод строки в sys.stderr.write, из-за чего сообщения могут склеиваться. Решение: всегда завершать write символом \n или использовать print для автоматического завершения.

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

Можно комбинировать оба метода: сначала print на консоль, затем write в файл. Или использовать буфер с последующей записью.


def dual_write(text):
    import sys
    sys.stdout.write(text + '\n')  # на экран
    with open('log.txt', 'a') as f:
        f.write(text + '\n')       # в файл

dual_write("Лог-сообщение")

Проблема: открытие файла при каждом вызове снижает производительность. Решение: передавать файловый объект как параметр или использовать контекстный менеджер на уровне вызова.

Расширенные примеры сравнения print и write

Ниже приведены дополнительные сценарии, демонстрирующие различия и особенности использования.

1. Запись бинарных данных

Метод write может записывать байты в бинарный файл, в то время как print ожидает строку и преобразует её в текст.

Пример

# Запись байтов через write
with open('binary.bin', 'wb') as f:
    f.write(b'\x00\x01\x02\x03')

# Чтение и проверка
with open('binary.bin', 'rb') as f:
    data = f.read()
print(data)  # b'\x00\x01\x02\x03'
b'\x00\x01\x02\x03'

2. Использование io.StringIO для буферизации

Модуль io позволяет создать строковый буфер, к которому применим как write, так и print (через параметр file).

Пример

import io
from contextlib import redirect_stdout

buffer = io.StringIO()
# Вариант с write
buffer.write("Строка через write\n")
# Вариант с print, перенаправленным в буфер
print("Строка через print", file=buffer)

result = buffer.getvalue()
buffer.close()
print(result)
Строка через write
Строка через print

3. Измерение скорости: print vs write

Сравним время выполнения для записи 100000 строк в файл.

Пример

import timeit

setup_code = '''
import sys
'''

print_code = '''
with open('test.txt', 'w') as f:
    for i in range(100000):
        print(i, file=f)
'''

write_code = '''
with open('test.txt', 'w') as f:
    for i in range(100000):
        f.write(str(i) + '\n')
'''

t1 = timeit.timeit(print_code, setup=setup_code, number=1)
t2 = timeit.timeit(write_code, setup=setup_code, number=1)
print(f"print: {t1:.4f} сек")
print(f"write: {t2:.4f} сек")
print: 0.5678 сек
write: 0.4321 сек

Вывод:

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

4. Форматированный вывод с write

Для форматирования можно использовать f-строки или метод format перед передачей в write.

Пример

name = "Алиса"
age = 30
# Форматирование перед write
line = f"{name}, возраст {age}\n"
sys.stdout.write(line)
Алиса, возраст 30

5. Запись в несколько файлов одновременно

Метод write позволяет легко организовать параллельную запись в разные потоки.

Пример

import sys

files = []
for name in ['out1.txt', 'out2.txt']:
    files.append(open(name, 'w'))

try:
    for i in range(5):
        for f in files:
            f.write(f"Строка {i}\n")
finally:
    for f in files:
        f.close()

# Проверка содержимого
for name in ['out1.txt', 'out2.txt']:
    with open(name) as f:
        print(f.read(), end='')
Строка 0
Строка 1
Строка 2
Строка 3
Строка 4
Строка 0
Строка 1
Строка 2
Строка 3
Строка 4

6. Обработка исключений при записи

При использовании write могут возникать ошибки, такие как переполнение диска или закрытие потока. Обработка аналогична для обоих методов.

Пример

try:
    with open('/root/protected.txt', 'w') as f:
        f.write('данные')
except PermissionError as e:
    sys.stderr.write(f"Ошибка доступа: {e}\n")
Ошибка доступа: [Errno 13] Permission denied: '/root/protected.txt'

Сравнение print и write в Python - comments

En
Python print write (python)