Правильный способ записи строки в файл?
Я привык делать print >>f, "hi there"
однако, кажется, что print >> становится устаревшим. Каков рекомендуемый способ сделать строку выше?
обновление:
Что касается всех этих ответов с "n"...является ли это универсальным или специфичным для Unix? Т. е. я должен делать "rn" в Windows?
10 ответов:
это должно быть так:
with open('somefile.txt', 'a') as the_file: the_file.write('Hello\n')Из Документации:
не используйте
os.linesepкак Терминатор строки при записи файлов, открытых в текстовом режиме (по умолчанию); используйте один '\n' вместо этого, на всех платформах.некоторые полезные чтения:
- The
withсообщенииopen()
- 'a' для добавления или использования
- 'W', чтобы написать с усечением
os(особенноos.linesep)
вы должны использовать
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 что касается новых строк:
на выходе, если новая строка отсутствует, любой
'\n'написанные символы переводятся в системный разделитель строк по умолчанию,os.linesep. Если новая строка'', не производится. Если newline-это любое другое юридическое значение, любое'\n'написанные символы переводятся в заданную строку.
на python docs рекомендую так:
with open('file_to_write', 'w') as f: f.write('file contents')Так вот как я обычно это делаю :)
заявление от docs.python.org:
Это хорошая практика, чтобы использовать "С" ключевое слово при работе с файлом объекты. Это имеет то преимущество, что файл закрыт после его набор заканчивается, даже если по пути возникает исключение. Это также намного короче, чем написание эквивалента попробуйте-наконец блоки.
по поводу ОС.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 делает не произвести тот же результат, что и
'\n'. Нет никакого способа, чтобы это могло привести к тому же результату.'hi there' + os.linesepэквивалентно'hi there\r\n', которая составляет не эквивалентно'hi there\n'.это так просто: используйте
\nкоторый будет автоматически переведен в ОС.linesep. и это было так просто с тех пор, как первый порт Python для Windows.нет смысла в использовании ОС.linesep в системах, отличных от Windows, и это приводит к неправильным результатам в Windows.
Не используйте ОС.linesep!
Я не думаю, что есть "правильный" путь.
Я хотел бы использовать:
with open ('myfile', 'a') as f: f.write ('hi there\n')памяти Тим Подхалим.
в Python 3 это функция, но в Python 2 Вы можете добавить это в начало исходного файла:
from __future__ import print_functionвы тут
print("hi there", file=f)
если вы пишете много данных и скорость является проблемой, вы должны, вероятно, пойти с
f.write(...). Я сделал быстрое сравнение скорости, и это было значительно быстрее, чемprint(..., file=f)при выполнении большого количества операций записи.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)в среднем
writeзакончил в 2.45 s на моей машине, в то время какесли вы решите пойти с
print(..., file=f)вы вероятно, вы обнаружите, что время от времени захотите подавлять новую строку или заменять ее чем-то другим. Это можно сделать, установив необязательный , например,with open("test", 'w') as f: print('Foo1,', file=f, end='') print('Foo2,', file=f, end='') print('Foo3', file=f)какой бы способ вы ни выбрали я бы предложил использовать
withтак как это делает код намного легче читать.обновление: эта разница в производительности объясняется тем, что
writeсильно буферизуется и возвращается до того, как какие-либо записи на диск действительно происходят (см. ответ), а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 С для
writeи 3.10 s для
когда вы сказали строку, это означает некоторые сериализованные символы, которые заканчиваются символами '\n'. Строка должна быть последней в какой-то момент, поэтому мы должны рассмотреть '\n' в конце каждой строки. Вот решение:
with open('YOURFILE.txt', 'a') as the_file: the_file.write('Hello')в режиме добавления после каждой записи курсор перемещается в новую строку, если вы хотите использовать режим "w", вы должны добавить символы "\n " в конце функции write ():
the_file.write('Hello'+'\n')
С 3.5 вы также можете использовать pathlib для этого:
путь.write_text (data, encoding=None, errors=None)
откройте указанный файл в текстовом режиме, запишите в него данные и закройте файл:
import pathlib pathlib.Path('textfile.txt').write_text('content')
можно использовать
ioмодуль, как в:import io my_string = "hi there" with io.open("output_file.txt", mode='w', encoding='utf-8') as f: f.write(my_string)
Comments