Как записать символ новой строки в кодировке ascii в файл с python - PullRequest
2 голосов
/ 22 сентября 2019

Я думал, что это должно работать:

file = open('filename.ppm', 'wb')
file.write('upper\nlower'.encode(encoding='ascii'))

Когда я запускаю код, хотя нет перевода строки;filename.pmm содержит «верхний нижний уровень» при открытии с помощью блокнота.

Ответы [ 3 ]

5 голосов
/ 22 сентября 2019

Укажите кодировку в open():

>>> with open("filename.ppm", "w", encoding="ascii") as f:
...     f.write("upper\nlower")

$ cat filename.ppm
upper
lower $

В документации для функции open() может быть несколько подсказок о том, почему ваш текущий метод дает вам то, что вы не делали.t Ожидайте.

Во-первых, относительно новой строки и \n против \r\n:

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

Я полагаю, что в вашем случае вы пишете байтов в выходной поток, это преобразование может не произойти, так как «необработанные» байты записываются в файл.

Еще одна вещь, о которой стоит упомянуть, это использование encoding="ascii".В этом случае это не должно иметь значения, потому что ASCII является подмножеством Unicode, и все ваши символы попадают в диапазон ASCII.

>>> all(i.isascii() for i in "upper\nlower")
True
2 голосов
/ 23 сентября 2019

Когда вы записываете в файл в режиме двоичный ('wb'), Python записывает точно предоставленных вами байтов.Таким образом, если вы пишете 'foo\nbar', это то, что записывается на диск - даже если '\n' не распознается как маркер новой строки на платформе, на которой выполняется ваш код.

Если вы пишете в файл в текст режим ('w'), Python преобразует '\n' в соответствующий маркер новой строки для платформы, на которой выполняется код, если вы не установите параметр newline:

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

1 голос
/ 22 сентября 2019

Windows использует \r\n для представления новой строки, тогда как Linux просто использует \n.Добавьте возврат каретки \r, чтобы увидеть разрывы строк в блокноте.

file.write('upper\r\nlower')
...