'\n' == 'posix', '\r\n' == 'nt' (python) это правильно?

Я пишу сценарий Python(2.7), который пишет файл и должен работать на Linux, Windows и, возможно, OSX. К сожалению, для проблем совместимости я должен использовать возврат каретки и перевод строки в стиле Windows. Это нормально, если я предполагаю:

str = someFunc.returnA_longText()
with open('file','w') as f:
    if os.name == 'posix':
        f.write(str.replace('\n','\r\n'))
    elif os.name == 'nt'
        f.write(str)    

Должен ли я рассмотреть другое? os.name имеет другие альтернативы ("posix", "nt", "os2", "ce", "java", "riscos"). Должен ли я использовать вместо этого модуль платформы?

Обновление 1:
1. Цель состоит в том, чтобы использовать '\r\n' в любой ОС.
2. Я получаю ул от

str = etree.tostring(root, pretty_print=True, 
                     xml_declaration=True, encoding='UTF-8')

Я не читаю файл.
3. По моей вине, мне лучше проверить os.linesep?

Резюме решения:

with io.open('file', mode='w', newline='\r\n', encoding='utf8') as f:
    f.write(etree.tostring(root, pretty_print=True,
                           xml_declaration=True, encoding='UTF-8').decode('utf-8'))

благодаря @Martijn Pieters

1 ответ

Решение

Файловые объекты Python могут обработать это для вас. По умолчанию запись в текстовый файл переводит \n окончания строки на платформе локальной, но вы можете переопределить это поведение.

Увидеть newline вариант в open() функциональная документация:

newline контролирует, как работает универсальный режим новой строки (это относится только к текстовому режиму). Может быть None, '', '\n', '\r', а также '\r\n', Это работает следующим образом:

  • При чтении ввода из потока, если перевод строки None, универсальный режим новых строк включен. Строки на входе могут заканчиваться '\n', '\r', или же '\r\n' и они переведены на '\n' прежде чем быть возвращенным звонящему. Если это '' включен режим универсального перевода строки, но окончания строки возвращаются вызывающей стороне без перевода. Если он имеет какие-либо другие допустимые значения, входные строки заканчиваются только данной строкой, а окончание строки возвращается вызывающей стороне без перевода.
  • При записи вывода в поток, если перевод строки None, любой '\n' написанные символы переводятся в системный разделитель строк по умолчанию, os.linesep, Если перевод строки '' или же '\n' перевод не происходит. Если символ новой строки является любым из других допустимых значений, любой '\n' написанные символы переводятся в заданную строку.

(вышесказанное относится к Python 3, Python 2 имеет похожее поведение, с io.open() предоставляя вам опции ввода / вывода Python 3, если это необходимо).

Установить newline опция, если вам нужно указать, какие концы строк пишутся:

with open('file', 'w', newline='\r\n') as f:

В Python 2 вам нужно открыть файл в двоичном режиме:

with open('file', 'wb') as f:
    # write `\r\n` line separators, no translation takes place

или использовать io.open() и напишите текст Unicode:

import io

with io.open('file', 'w', newline='\r\n', encoding='utf8') as f:
     f.write(str.decode('utf8'))

(но выбирайте подходящие кодировки; всегда полезно явно указывать кодек даже в Python 3).

Вы всегда можете использовать os.linesep постоянный, если вашей программе нужно знать соответствующий разделитель строк для текущей платформы.

Другие вопросы по тегам