F.write vs print >> f
Существует как минимум два способа записи в файл в python:
f = open(file, 'w')
f.write(string)
или
f = open(file, 'w')
print >> f, string
Есть ли разница между этими двумя? Или еще один питонический? Я пытаюсь написать кучу HTML в файл, поэтому мне нужен куча записей для записи/печати через мой файл (но мне не нужен механизм шаблонов).
Ответы
Ответ 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 вы можете вместо этого использовать функцию печати, что вы должны заметить, делает некоторые дополнительные вещи (например, автоматически конвертирует числа в строки для вас и т.д.).