Правильный способ записи строки в файл?
У меня есть вопрос о том, как записать строку в файл в современном 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 с учетом переносов строк
Найти все файлы с расширением .txt в директории на Python
Как открыть несколько файлов с помощью "with open" в Python?
Вывод строки в текстовый файл