2016-06-28 13 views
14

модуль ОС Пайтона содержит значение для платформы конкретной линии, разделяющей строки, но документы явно говорят не использовать его при записи в файл:Что такое os.linesep?

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

Docs

Previous questions исследовали, почему вы не должны использовать его в этом контексте, но то, что контекст это полезно? Когда следует использовать разделитель строк и для чего?

ответ

7

Документах, прямо скажем, не использовать его при записи в файл

Это не является точным, док говорит не использовал его в текстовом режиме.

os.linesep используется, когда вы хотите перебирать строки текстового файла. Внутренний сканер распознает os.linesep и заменит его на «\ n».

Для иллюстрации, записать бинарный файл, который содержит 3 строки, разделенные "\ г \ п" (Windows разделителем):

import io 

filename = "text.txt" 

content = b'line1\r\nline2\r\nline3' 
with io.open(filename, mode="wb") as fd: 
    fd.write(content) 

Содержание двоичного файла:

with io.open(filename, mode="rb") as fd: 
    for line in fd: 
     print(repr(line)) 

NB: Я использовал режим «rb» для чтения файла в виде двоичного файла.

я получаю:

b'line1\r\n' 
b'line2\r\n' 
b'line3' 

Если я прочитал содержимое файла с помощью текстового режима, например:

with io.open(filename, mode="r", encoding="ascii") as fd: 
    for line in fd: 
     print(repr(line)) 

я получаю:

'line1\n' 
'line2\n' 
'line3' 

Ограничитель заменяется на «\ n».

os.linesep также используется в режиме записи: любой «\ п» символ преобразуется в линии сепараторе системы по умолчанию: «\ г \ п» на Windows, «\ п» на POSIX и т.д.

С помощью функции io.open вы можете заставить разделитель строк использовать все, что хотите.

Пример: как написать текстовый файл для Windows:

with io.open(filename, mode="w", encoding="ascii", newline="\r\n") as fd: 
    fd.write("one\ntwo\nthree\n") 

Если вы читаете этот файл в текстовом режиме, как это:

with io.open(filename, mode="rb") as fd: 
    content = fd.read() 
    print(repr(content)) 

Вы получаете:

b'one\r\ntwo\r\nthree\r\n' 
4

Как вы знаете, чтение и запись файлов в текстовом режиме в python преобразует разделитель строки на конкретную платформу в '\ n' и наоборот. Но если вы читаете файл в двоичном режиме, конверсия не происходит. Затем вы можете явно преобразовать окончания строк, используя string.replace(os.linesep, '\n'). Это может быть полезно, если файл (или поток или что-то еще) содержит комбинацию двоичных и текстовых данных.

+0

Это Wouldn Не работает, если кодировка несовместима. 'len ('\ n'.encode (' utf-16 '))' is 4 –