Как удалить ^M

Как я могу удалить ^M символ из текстового файла (в конце строки) в скрипте Python?

Я сделал следующее, и есть ^M на каждом разрыве строки.

file = open(filename, "w")
file.write(something)

8 ответов

Решение

Если вы пишете файл, вы должны указать open(filename, "wb"), Таким образом, вы будете писать в двоичном режиме, и Python не будет пытаться определить правильные переводы строки для системы, в которой вы находитесь.

Python может открыть файл в двоичном или текстовом режиме. Текст по умолчанию, поэтому режим "w" означает запись в текстовом режиме. В текстовом режиме Python корректирует окончания строк для платформы, на которой вы находитесь. Это означает, что в Windows этот код:

f = open("foo.txt", "w")
f.write("Hello\n")

приведет к текстовому файлу, содержащему "Hello\r\n".

Вы можете открыть файл в двоичном режиме, используя "b" в режиме:

f = open("foo.txt", "wb")
f.write("Hello\n")

приводит к текстовому файлу, содержащему "Hello\n".

string.replace('\r', '') работал для меня.

Ужасно, но ни r+, ни r+b, ни НИЧЕГО не сработало (для меня конечно):(

Как явно установить возврат каретки при выполнении json.dump?содержит решение:openфункция имеет дополнительный параметр newline:

      file = open(filename, "w", newline="\n")
file.write(something)

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

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

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

dos2unix filename.py

преобразовать разрывы строк в стиль UNIX.

Для переносимости вы можете попробовать следующее

import os
file = open(filename, "w")
file.write(something.replace('\r\n', os.linesep))

Чтобы исправить (нормализовать) все файлы в репозитории, вы также можете запустить

git add --renormalize .

лучше всего это работало без необходимости писать сценарий для исправления файлов. Чтобы убедиться, что окончания строк отображаются вgit statusвы можете установить это:

git config --global core.autocrlf input

в книге Mac.

Запустите autopep8 для файла

> apt-get install python-autopep8

> autopep8 python_file_name > new_python_file_name.py
Другие вопросы по тегам