Правильный способ записи строки в файл?
У меня есть вопрос о том, как записать строку в файл в современном Python. Я услышал, что следующий способ считается устаревшим:
print >>f, "hi there"
Также меня интересует, работает ли "\n"
на всех платформах, или мне следует использовать "\r\n"
на Windows?
5 ответ(ов)
Что касается 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) # тот же результат, что и в предыдущей строке ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>
На Windows:
Как и ожидалось, os.linesep НЕ дает такой же результат, как '\n'
. Никак не может быть так, что 'hi there' + os.linesep
эквивалентно 'hi there\n'
. На самом деле, 'hi there' + os.linesep
равно 'hi there\r\n'
, что НЕ эквивалентно 'hi there\n'
.
Все очень просто: используйте \n
, который будет автоматически преобразован в os.linesep. И так было, начиная с первого порта Python для Windows.
Нет смысла использовать os.linesep на системах, отличных от Windows, и он дает неправильные результаты на Windows.
НЕ ИСПОЛЬЗУЙТЕ os.linesep!
В Python 3 print
является функцией, в то время как в Python 2 — это оператор. Однако, если вы хотите использовать синтаксис функции print
в Python 2, вы можете добавить следующую строку в начало вашего исходного файла:
from __future__ import print_function
После этого вы сможете использовать print
как функцию, например:
print("hi there", file=f)
Это позволит вам использовать более современный синтаксис и делать ваш код более совместимым с Python 3.
Когда вы говорите о строке (Line), вы имеете в виду последовательность символов, которая заканчивается символом новой строки ('\n'). Строка должна заканчиваться в какой-то момент, поэтому мы должны учитывать символ '\n' в конце каждой строки. Вот решение:
with open('YOURFILE.txt', 'a') as the_file:
the_file.write("Hello")
В режиме добавления (append mode) после каждой записи курсор перемещается на новую строку. Если вы хотите использовать режим 'w', вам нужно добавить символы '\n' в конце функции write()
:
the_file.write("Hello\n")
Таким образом, в режиме 'w' вы должны явно указывать символ новой строки, чтобы правильно форматировать ваши записи.
Если вы хотите избежать использования write()
или writelines()
и соединять строки с помощью \n
самостоятельно, вы можете передать все ваши строки в print()
, указав разделитель новой строки и файловый дескриптор в качестве аргументов ключевых слов. Этот фрагмент предполагает, что ваши строки не содержат завершающих символов новой строки.
print(line1, line2, sep="\n", file=f)
Вам не нужно вставлять специальный символ новой строки в конце, так как print()
делает это за вас.
Если у вас есть произвольное количество строк в списке, вы можете использовать распаковку списка, чтобы передать их все в print()
.
lines = ["The Quick Brown Fox", "Lorem Ipsum"]
print(*lines, sep="\n", file=f)
Использование "\n"
в качестве разделителя допустимо на Windows, потому что print()
также автоматически преобразует его в Windows-формат новой строки CRLF ("\r\n"
).
Если вы хотите вставить элементы в список с заданным форматом, построчно, вы можете начать с такого кода:
with open('somefile.txt', 'a') as the_file:
for item in items:
the_file.write(f"{item}\n")
Здесь мы открываем файл somefile.txt
в режиме добавления ('a'
), что позволяет вам записывать данные в конец файла. Затем с помощью цикла for
мы проходим по всем элементам в списке items
и записываем каждый элемент в файл, добавляя символ переноса строки (\n
) после каждого элемента, чтобы каждый элемент был на новой строке.
UnicodeDecodeError: Кодек 'charmap' не может декодировать байт X в позиции Y: символ отображается как <неопределённый>
Сохранение списка в файл с помощью Python с учетом переносов строк
Как открыть несколько файлов с помощью "with open" в Python?
open() в Python не создает файл, если он не существует
Вывод строки в текстовый файл