Правильный способ записи строки в файл?

Я'привык делать print >>f, "hi there".

Однако, похоже, что print >>> становится устаревшим. Какой способ рекомендуется использовать для выполнения приведенной выше строки?

Update: Что касается всех ответов с "\n"... это универсально или специфично для Unix? IE, должен ли я делать "\r\n" на Windows?

Комментарии к вопросу (3)
Решение

Это должно быть как простой, как:

with open('somefile.txt', 'a') as the_file:
    the_file.write('Hello\n')

Из Документации:

не используйте `ОС.linesep как признак конца строки при записи файлов, открытых в текстовом режиме (по умолчанию); использовать один '\П' вместо этого, на всех платформах.

Некоторым полезно читать:

Комментарии (10)

Вы должны использовать функцию print(), которая доступна начиная с Python 2.6+

from __future__ import print_function  # Only needed for Python 2
print("hi there", file=f)

Для Python 3 вам не нужен import, так как функция print() используется по умолчанию.

Альтернативой может быть использование:

f = open('myfile', 'w')
f.write('hi there\n')  # python will convert \n to os.linesep
f.close()  # you can omit in most cases as the destructor will call it

Цитирую из документации Python относительно newline:

При выводе, если newline равен None, любые '\n' символы переводятся в системный разделитель строк по умолчанию, os.linesep. Если newline равен ''', перевода не происходит. Если newline равно любому из других допустимых значений, все записанные символы '\n' переводятся в заданную строку.

Комментарии (18)

В питон документы рекомендую этот способ:

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

Так что это, как я обычно это делаю :)

Заявление от docs.python.org:

Это хорошая практика, чтобы использовать 'с' ключевое слово при работе с файлом объекты. Это имеет то преимущество, что файл закрыт после отделкой люкс, даже если исключение возникает на пути. Это также намного короче, чем писать эквивалент попробовать-наконец-то блоков.

Комментарии (3)

В отношении ОС.linesep:

Здесь является точной неотредактированный языке Python 2.7.1 переводчик сеанс в Windows:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>

На Windows:

Как и ожидалось, ОС.linesep ли не производить такой же результат, как '\П'. Нет никакого способа, которым он мог бы произвести тот же результат. 'привет' + ОС.linesep эквивалентно 'привет\р\н', который **** не эквивалентно'привет\п'`.

Он's это просто: используйте , который будет переведен автоматически в ОС.linesep. И это'ы было так просто с тех пор, как первый порт на Python в Windows.

Нет никакого смысла в использовании ОС.linesep на не-Windows систем, и он выдает неправильные результаты на Windows.

Не используйте ОС.linesep!

Комментарии (7)

Я не думаю, что существует "правильный" путь.

Я бы использовал:

with open ('myfile', 'a') as f: f.write ('hi there\n')

In memoriam Tim Toady.

Комментарии (7)

В Python 3 это функция, но в Python 2 вы можете добавить это в начало исходного файла:

from __future__ import print_function

Затем вы делаете

print("hi there", file=f)
Комментарии (0)

Если вы пишете много данных и скорость вы должны, вероятно, пойти с ф.писать(...). Я сделал небольшое сравнение скорости и она значительно быстрее, чем `печать(..., файл=Ф)`` при выполнении большого количества операций записи.

import time    

start = start = time.time()
with open("test.txt", 'w') as f:
    for i in range(10000000):
        # print('This is a speed test', file=f)
        # f.write('This is a speed test\n')
end = time.time()
print(end - start)

В среднем писать закончили в 2.45 s на моей машине, в то время как печать ушло около 4 раз длиннее (9.76 сек). Это, как говорится, в большинстве реальных сценариях это не будет проблемой.

Если вы решите перейти с с принтом(..., файл=Ф)` - вы, вероятно, обнаружите, что вы'll хочу подавить строки время от времени, или заменить его чем-то другим. Это может быть сделано путем установки параметра необязательныеокончание``, например;

with open("test", 'w') as f:
    print('Foo1,', file=f, end='')
    print('Foo2,', file=f, end='')
    print('Foo3', file=f)

Какой бы путь вы выбираете я'd предлагает с помощью с, так как это делает код намного легче читать.

Обновление: такая разница в показателях объясняется тем, что пишут - это сильно буфер и возвращает до каких-либо записей на диск на самом деле происходит (см. Этот ответ), в то время как печать (вероятно) использует буфферизацию. Простой тест для этого можно было бы проверить работу на длительный пишет также, Где недостатки (в плане скорости) для буфферизацию будет менее выраженным.

start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
    for i in range(1000000):
        # print(long_line, file=f)
        # f.write(long_line + '\n')
end = time.time()

print(end - start, "s")

Разница в производительности становится гораздо менее выраженным, в среднем 2.20 S для писать и 3.10 для печать. Если вам нужно объединить кучу строк, чтобы получить это займет слишком много, производительность будет страдать, так использовать-случаях, когда печать будет эффективнее немного редко.

Комментарии (0)

С 3.5 вы также можете использовать [pathlib][1] для этой цели:

По пути.write_text(данные, кодировка=нет, ошибок=нет)

открыть файл, на который указывает в текстовом режиме, записывать на нее данные и закрыть файл:

import pathlib

pathlib.Path('textfile.txt').write_text('content')

[1]: https://docs.python.org/3/library/pathlib.html#pathlib.Path.write_text

Комментарии (0)

Когда вы сказали, что линия это означает, что некоторые сериализации героев, которые закончились на '\П' символы. Строка должна быть последней в какой-то момент, поэтому мы должны рассмотреть '\П' в конце каждой строки. Вот решение:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write('Hello')

в режиме дописывания после каждой записи курсора переместить на новую строку, если вы хотите использовать 'ш' режим вы должны добавить '\П' герои в конце написать() функции:

the_file.write('Hello'+'\n')
Комментарии (1)

Можно также использовать модуль ввода-вывода, Как в:

import io
my_string = "hi there"

with io.open("output_file.txt", mode='w', encoding='utf-8') as f:
    f.write(my_string)
Комментарии (0)

Вы также можете попробовать записывает

типун установить автоматически

`` из импорта записывает писатель

Писатель(именем='my_file', ВН='тхт') << ["по-рядка 1 Привет там-то", "в строке 2" и] ` Пишет вmy_file.txt`

Принимает Iterable или объект с поддержкой ул.____`.

Комментарии (0)

Когда мне нужно написать много новых строк, я определяю лямбда-выражение, которое использует функцию печати:

out = open(file_name, 'w')
fwl = lambda *x, **y: print(*x, **y, file=out) # FileWriteLine
fwl('Hi')

Этот подход имеет то преимущество, что он может использовать все функции, доступные с функцией печати.

Обновление: как упоминается Георгий в разделе комментариев, можно улучшить эту идею с частичной функция:

from functools import partial
fwl = partial(print, file=out)

ИМХО, это более функциональная и менее запутанный подход.

Комментарии (3)