Подтвердить что ты не робот

F.write vs print >> f

Существует как минимум два способа записи в файл в python:

f = open(file, 'w')
f.write(string)

или

f = open(file, 'w')
print >> f, string

Есть ли разница между этими двумя? Или еще один питонический? Я пытаюсь написать кучу HTML в файл, поэтому мне нужен куча записей для записи/печати через мой файл (но мне не нужен механизм шаблонов).

4b9b3361

Ответ 1

print не делает вещи file.write, что позволяет вам пропускать форматирование строк для некоторых основных вещей.

Вставляет пробелы между аргументами и добавляет терминатор строки.

print "a", "b" # prints something like "a b\n"

Он вызывает специальные методы __str__ или __repr__ объекта для преобразования его в строку.

print 1 # prints something like "1\n"

Вам придется вручную делать это, если вы использовали file.write вместо print.

Ответ 2

Я несколько не согласен с несколькими высказанными здесь мнениями, что print >> f является избыточным и его следует избегать в пользу f.write.

print и file.write - совсем другие операции. file.write просто непосредственно записывает строку в файл. print больше напоминает "render values ​​to stdout как текст". Естественно, результат рендеринга строки как текста - это просто строка, поэтому print >> f, my_string и f.write(my_string) почти взаимозаменяемы (за исключением добавления новой строки). Но ваш выбор между file.write и print обычно должен основываться на том, что вы делаете; вы пишете строку в файл или вы передаете значения в файл?

Конечно, print не является строго необходимым, поскольку вы можете реализовать его с помощью file.write. Но тогда file.write не является строго необходимым, потому что вы можете реализовать его с помощью операций в os для работы с файловыми дескрипторами. На самом деле они работают на разных уровнях, и вы должны использовать то, что наиболее подходит для вашего использования (обычно на уровне другого соседнего кода работает или на самом высоком уровне, который не мешает вам).

Я чувствую, что синтаксис print >> f довольно ужасен и является действительно хорошим примером того, почему print должна была быть функцией все время. Это значительно улучшилось в Python 3. Но даже если вы пишете код Python 2, который вы планируете переносить на Python 3, преобразовать print >> f, thing1, thing2, thing3, ... в print(thing1, thing2, thing3, file=f) гораздо проще, чем преобразовать окружность, где вы катите свой собственный код, чтобы сделать эквивалент рендеринга print, а затем вызовите f.write(text). Я уверен, что полуавтоматический конвертер от Python 2 до Python 3 даже сделает для вас конверсию, чего не удалось сделать, если вы избежите формы print >> f.

Нижняя строка: используйте print для вывода значений в stdout (или в файл). Используйте f.write для записи текста в файл.

Ответ 3

Вы не должны делать ничего из этого. Для большинства Pythonic нужно использовать функцию печати Python 3 (в отличие от инструкции печати Python 2):

f = open(file, 'w')
print(string, file=f)

Конечно, идеальный способ сделать это - просто использовать Python 3. Но если вы застряли с помощью Python 2, вы можете включить его, используя будущее оператора в верхней части файла:

from __future__ import print_function

Обратите внимание, что это изменяет печать другими способами, наиболее очевидно, что вам нужно добавить скобки вокруг своих аргументов. Но изменения - все улучшения, что является всей причиной изменения в Python 3. В то время как вы на нем, рассмотрите возможность использования всех будущих операторов для получения как можно большего количества резервных улучшений от Python 3.

Ответ 4

Согласитесь с @agf

Я предпочел print(..., file=f) из-за его гибкости.

with open('test.txt', 'w') as f:
    print('str', file=f)
    print(1, 20, file=f)

Также легко преобразовать существующую команду print.

write принимает только строку.

Ответ 5

Документация на print может помочь в этом: инструкция печати (документация на Python 2.7).

print по умолчанию выводит на стандартный вывод, который фактически является "файлоподобным" объектом (sys.stdout). Сам стандартный вывод имеет метод write(). Использование print >> f кажется ненужной абстракцией.

Кроме того, мне кажется слишком многословным. f.write() отлично.

Ответ 6

Как bottonline: используйте file.write при записи в файлы.

Идиома " → " для печати была заимствована из С++ в ранние дни Python и довольно неписана - настолько, что она больше не существует в Python 3.x - там, где можно использовать печать, теперь вместо функции выражение, чтобы записать в файл, но без специального синтаксиса для этого.

Как указывает @agf в его ответе, использование "print" для записи в файл делает больше вещей, чем просто вызов write - он автоматически вызывает str (obj), чтобы получить строковое представление объекта, тогда как .write требует, чтобы (байтовая) строка передается как параметр - в мире Python "явный лучше, чем неявный", поэтому еще один мотив для того, чтобы один с файлом .write вместо этого.

Ответ 7

Это предпочтительный способ, используя обработчики контекста:

with open(file, 'w') as f:
  f.write(string)

В python 2 я предпочитаю file.write, потому что синтаксис >> устарел. Для python 3 вы можете вместо этого использовать функцию печати, что вы должны заметить, делает некоторые дополнительные вещи (например, автоматически конвертирует числа в строки для вас и т.д.).