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