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



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



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



обновление:
Что касается всех этих ответов с "n"...является ли это универсальным или специфичным для Unix? Т. е. я должен делать "rn" в Windows?

577   10  

10 ответов:

это должно быть так:

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

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

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

некоторые полезные чтения:

вы должны использовать 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 заняло примерно в 4 раза больше времени (9.76 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 сильно буферизуется и возвращается до того, как какие-либо записи на диск действительно происходят (см. ответ), а 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 s для print. Если вам нужно объединить кучу строк, чтобы получить эту производительность линии loooong будет страдайте, поэтому используйте-случаи, когда print было бы более эффективно немного редко.

когда вы сказали строку, это означает некоторые сериализованные символы, которые заканчиваются символами '\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

    Ничего не найдено.