Я привык делать print >>f, "hi there"
Тем не менее, кажется, что print >>
становится устаревшим. Каков рекомендуемый способ сделать строку выше?
Обновление : Относительно всех этих ответов "\n"
... это универсально или специфично для Unix? IE, я должен делать "\r\n"
на Windows?
Ответы:
Это должно быть так просто, как:
Из документации:
Некоторое полезное чтение:
with
заявлениеopen()
os
(в частностиos.linesep
)источник
with
- это более безопасный способ забыть закрыть файл.the_file.close()
?Вы должны использовать
print()
функцию, которая доступна с Python 2.6+Для Python 3 вам не нужно
import
, так какprint()
функция по умолчанию.Альтернативой было бы использовать:
Цитирование из документации Python относительно новых строк:
источник
\n
" Требуется newline = "", иначе вы получите\r\r\n
Windows. Нет никаких причин возиться с os.linesep вообще.\r\n
которая содержит\n
перевод в os.linesep, то есть\r\n
конечный результат\r\r\n
.open('myfile','a')
вместоopen('myfile','w')
?Документы Python рекомендуют так:
Так я обычно так и делаю :)
Заявление от docs.python.org :
источник
with
цикл. Это заставляет меня постоянно открывать и закрывать файл, пока я продолжаю цикл. Может быть, я что-то здесь упускаю, или это действительно недостаток в этом конкретном сценарии?Относительно os.linesep:
Вот точный неотредактированный сеанс интерпретатора Python 2.7.1 в Windows:
В Windows:
Как и ожидалось, os.linesep НЕ дает того же результата, что и
'\n'
. Нет никакого способа, чтобы это могло привести к тому же самому результату.'hi there' + os.linesep
эквивалентно'hi there\r\n'
, что не эквивалентно'hi there\n'
.Это так просто: используйте,
\n
который будет автоматически переведен на os.linesep. И это было так просто с первого порта Python для Windows.Нет смысла использовать os.linesep в системах, отличных от Windows, и это приводит к неверным результатам в Windows.
НЕ ИСПОЛЬЗУЙТЕ os.linesep!
источник
os.linesep
Windows в текстовом режиме, результат\r\r\n
будет неправильным. «Windows использует ...» не имеет смысла. Библиотека C во время выполнения (и , следовательно , Python) перевести\n
на\r\n
на выходе в текстовом режиме. Другое программное обеспечение может вести себя по-другому. Это НЕ тот случай, когда все программное обеспечение, работающее в Windows, распознает одинокий\n
как разделитель строк при чтении в текстовом режиме. Python делает. Текстовый редактор Microsoft Notepad этого не делает.\r
...os.linesep
здесь "неправильно". Это какDepartment of Redundancy Department
. Да, ты можешь сделать это. Нет, ты не хочешь.Я не думаю, что есть «правильный» путь.
Я хотел бы использовать:
Памяти Тима Тоади .
источник
with
выходит за рамки.open(..., 'a')
или даже'at'
.В Python 3 это функция, но в Python 2 вы можете добавить это в начало исходного файла:
Тогда вы делаете
источник
Если вы пишете много данных, и скорость - это проблема, с которой вам, вероятно, стоит пойти
f.write(...)
. Я сделал быстрое сравнение скорости, и это было значительно быстрее, чемprint(..., file=f)
при выполнении большого количества записей.В среднем
write
финишировал за 2,45 секунды на моей машине, аprint
занял в 4 раза больше времени (9,76 секунды). При этом в большинстве реальных сценариев это не будет проблемой.Если вы решите пойти с
print(..., file=f)
вами, вы, вероятно, обнаружите, что хотите время от времени подавлять новую строку или заменять ее чем-то другим. Это можно сделать, установив необязательныйend
параметр, например;Какой бы способ вы ни выбрали, я бы посоветовал использовать
with
его, поскольку он значительно облегчает чтение кода.Обновление : это различие в производительности объясняется тем фактом, что он
write
имеет высокую буферизацию и возвращается до того, как произойдет какая-либо запись на диск (см. Этот ответ ), тогда какprint
(вероятно) используется буферизация строки. Простым тестом для этого будет проверка производительности и для длинных записей, где недостатки (с точки зрения скорости) для буферизации строк будут менее выраженными.Разница в производительности теперь становится гораздо менее выраженной, со средним временем 2,20 с
write
и 3,10 сprint
. Если вам нужно объединить кучу строк, чтобы получить эту длинную строку, производительность пострадает, поэтому случаи, гдеprint
бы эффективность была более эффективной, встречаются немного редко.источник
Начиная с 3.5 вы также можете использовать
pathlib
для этой цели:источник
Когда вы говорите «Линия», это означает некоторые сериализованные символы, которые заканчиваются на символы «\ n». Строка должна быть последней в некоторой точке, поэтому мы должны рассмотреть '\ n' в конце каждой строки. Вот решение:
в режиме добавления после каждой записи курсор перемещается на новую строку, если вы хотите использовать
w
режим, вы должны добавить\n
символы в концеwrite()
функции:источник
Можно также использовать
io
модуль как в:источник
Для записи текста в файл в колбу можно использовать:
источник
Вы также можете попробовать
filewriter
pip install filewriter
Пишет в
my_file.txt
Принимает итерируемый или объект с
__str__
поддержкой.источник
Когда мне нужно много писать новые строки, я определяю лямбду, которая использует
print
функцию:Преимущество этого подхода состоит в том, что он может использовать все функции, доступные в данной
print
функции.Обновление: как упомянул Георгий в разделе комментариев, можно улучшить эту идею с помощью
partial
функции:ИМХО, это более функциональный и менее загадочный подход.
источник
from functools import partial; fwl = partial(print, file=out)
.