Правильный способ записи строки в файл? - PullRequest
925 голосов
/ 28 мая 2011

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

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

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

Ответы [ 12 ]

938 голосов
/ 28 мая 2011

Вы должны использовать функцию 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.Если перевод строки '', перевод не выполняется.Если символ новой строки является любым из других допустимых значений, любые записанные символы '\n' переводятся в данную строку.

928 голосов
/ 28 мая 2011

Это должно быть просто:

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

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

Не используйте os.linesep в качестве ограничителя строки при записи файлов, открытых в текстовом режиме (по умолчанию); вместо этого используйте один \ n на всех платформах.

Полезное чтение:

105 голосов
/ 13 октября 2012

Документы python рекомендуют так:

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

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

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

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

85 голосов
/ 29 мая 2011

Относительно os.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:

Как и ожидалось, 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!

53 голосов
/ 28 мая 2011

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

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

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

В память Тим Тоади .

21 голосов
/ 28 мая 2011

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

from __future__ import print_function

Тогда вы делаете

print("hi there", file=f)
16 голосов
/ 13 сентября 2016

Если вы пишете много данных, и скорость - это проблема, вы, вероятно, должны пойти на 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 с на моей машине, тогда как print длился примерно в 4 раза дольше (9,76 с). При этом в большинстве реальных сценариев это не будет проблемой.

Если вы решите перейти с print(..., file=f), вы, вероятно, обнаружите, что время от времени вы хотите подавлять символ новой строки или заменять его чем-то другим. Это можно сделать, установив необязательный параметр end, например;

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

Какой бы способ вы ни выбрали, я бы предложил использовать with, поскольку он значительно облегчает чтение кода.

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

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 с print. Если вам нужно объединить несколько строк, чтобы получить эту длинную строку, производительность пострадает, поэтому случаи использования, где print будет более эффективным, немного редки.

9 голосов
/ 12 сентября 2018

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

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

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

import pathlib

pathlib.Path('textfile.txt').write_text('content')
4 голосов
/ 26 августа 2016

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

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

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

the_file.write('Hello'+'\n')
3 голосов
/ 29 августа 2018

Можно также использовать модуль io как в:

import io
my_string = "hi there"

with io.open("output_file.txt", mode='w', encoding='utf-8') as f:
    f.write(my_string)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...