Converting crlf to lf in windows

Как конвертировать CRLF в LF на машине Windows в Python

Итак, я получил этот шаблон, все они заканчиваются в LF, и я могу заполнить некоторые термины внутри с форматом и все равно получить LF файлы, открыв с помощью “wb”

Эти шаблоны используются в развертывании script на машине Windows для развертывания на сервере unix.

Проблема в том, что многие люди собираются возиться с этим шаблоном, и я на 100% уверен, что некоторые из них будут помещать некоторые CRLF внутрь.

Как я мог, используя python преобразовать все crlf в lf?

ИЗМЕНИТЬ

Ну, я плохо, у меня была ошибка в моем коде, открытие в “wb” всегда помещало lf в конец строк, даже если файл использовал crlf раньше.

Вот код, который я использую, если вам интересно:

Так что проблем нет, все работает нормально: x

Открытая функция Python поддерживает режим ‘rU’ для универсальных строк новой строки, и в этом случае он не против, какой тип новой строки имеет каждая строка. В Python 3 вы также можете запросить конкретную форму новой строки с аргументом newline для open.

Таким образом, переход от одной формы к другой довольно простой в Python:

(Из-за аргумента новой строки U фактически не рекомендуется в Python 3, эквивалентная форма – newline=None .)

Преобразование окончаний строк на месте (с помощью Python 3)

Windows для Linux/Unix

Ниже приведен короткий скрипт для прямого преобразования окончаний строк Windows ( \r\n также называемого CRLF ) в конец строки Linux/Unix ( \n также называемый LF ) на месте (без создания дополнительного выходного файла):

Linux/Unix для Windows

Просто поменяйте окончание строки на content.replace(UNIX_LINE_ENDING, WINDOWS_LINE_ENDING) .

Обозначение кода

Важно: двоичный режим. Нам нужно убедиться, что мы открываем файл оба раза в двоичном режиме ( mode=’rb’ и mode=’wb’ ) для преобразования в работу.

При открытии файлов в текстовом режиме ( mode=’r’ или mode=’w’ без b ) окончание собственных строк платформы ( \r\n в Windows и \r на старых версиях Mac OS) автоматически преобразуется в Python Unix- конец строки строки: \n . Поэтому вызов content.replace() не смог найти никаких окончаний строк для замены.

В двоичном режиме такое преобразование не выполняется.

Двоичные строки В Python 3, если не указано иначе, строки сохраняются как Unicode ( UTF-8 ). Но мы открываем наши файлы в двоичном режиме – поэтому нам нужно добавить b перед нашими заменяющими строками, чтобы сказать Python также обрабатывать эти строки как двоичные.

Необработанные строки В Windows разделитель путей – это обратная косая черта \ которую нам нужно будет сбежать в обычной строке Python с \\ . Добавляя r перед строкой, мы создаем так называемую необработанную строку, которая не нуждается в экранировании. Таким образом, вы можете напрямую скопировать/вставить путь из проводника Windows.

Читайте также:  Windows 10 enterprise x86 dvd

Альтернатива Мы открываем файл дважды, чтобы избежать необходимости перестановки указателя файла. Мы также могли бы открыть файл один раз с помощью mode=’rb+’ но тогда нам нужно было бы переместить указатель назад, чтобы начать его чтение ( open_file.seek(0) ), и open_file.seek(0) его исходное содержимое перед написанием нового one ( open_file.truncate(0) ).

Простое открытие файла в режиме записи делает это автоматически для нас.

Приветствия и счастливое программирование,
winklerrr

Можно исправить существующие шаблоны с испорченным окончанием с помощью этого кода:

How to convert CRLF to LF on a Windows machine in Python

So I got those template, they are all ending in LF and I can fill some terms inside with format and still get LF files by opening with «wb» .

Those templates are used in a deployment script on a windows machine to deploy on a unix server.

Problem is, a lot of people are going to mess with those template, and I’m 100% sure that some of them will put some CRLF inside.

How could I, using Python, convert all the CRLF to LF?

Edit: Well, my bad, I had a bug in my code, opening in «wb» always put LF at the end of the lines even if the file was using CRLF before.

Here is the code I’m using if you are wondering:

So no problem, everything is working fine 😡

4 Answers 4

Convert line endings in-place (with Python 3)

Windows to Linux/Unix

Here is a short script for directly converting Windows line endings ( \r\n also called CRLF ) to Linux/Unix line endings ( \n also called LF ) in-place (without creating an extra output file):

Linux/Unix to Windows

Just swap the constants for the line endings in the str.replace() call like so: content.replace(UNIX_LINE_ENDING, WINDOWS_LINE_ENDING) .

Code Explanation

Binary Mode

Important: We need to make sure that we open the file both times in binary mode ( mode=’rb’ and mode=’wb’ ) for the conversion to work.

When opening files in text mode ( mode=’r’ or mode=’w’ without b ), the platform’s native line endings ( \r\n on Windows and \r on old Mac OS versions) are automatically converted to Python’s Unix-style line endings: \n . So the call to content.replace() couldn’t find any \r\n line endings to replace.

In binary mode, no such conversion is done. Therefore the call to str.replace() can do its work.

Binary Strings

In Python 3, if not declared otherwise, strings are stored as Unicode ( UTF-8 ). But we open our files in binary mode — therefore we need to add b in front of our replacement strings to tell Python to handle those strings as binary, too.

Raw Strings

On Windows the path separator is a backslash \ which we would need to escape in a normal Python string with \\ . By adding r in front of the string we create a so called «raw string» which doesn’t need any escaping. So you can directly copy/paste the path from Windows Explorer into your script.

Читайте также:  Ccleaner professional для windows 10 64 bit с активатором

(Hint: Inside Windows Explorer press CTRL + L to automatically select the path from the address bar.)

Alternative solution

We open the file twice to avoid the need of repositioning the file pointer. We could also have opened the file once with mode=’rb+’ but then we would have needed to move the pointer back to start after reading its content ( open_file.seek(0) ) and truncate its original content before writing the new one ( open_file.truncate(0) ).

Simply opening the file again in write mode does that automatically for us.

Cheers and happy programming,
winklerrr

InterMaster.com.ru

О бизнесе в интернете, отдыхе в реале и просто о жизни…

Как я меняю в проектах концы строк с CRLF на LF

Иногда бывает такая ситуация – получаешь от заказчика движок для его дальнейшего «допиливания». Пытаешься положить его в репозиторий Git – и получаешь кучу варнингов типа:

Это понятно — файлы в исходнике писались/правились до меня разными людьми и на разных операционных системах. Поэтому в файлах наблюдается полная мешанина в вопросе формата окончания строк.

Небольшая справка для тех, кто не в курсе. В разных операционных системах принят разный формат символов, обозначающий перевод строк:

  • Windows — \r\n или CRLF (код 0D0A)
  • Unix — \n или LF (код 0A)
  • Mac — \r или CR (код 0D).

Такую разносортицу в своем проекте мне держать не хочется, поэтому я предпочитаю перед началом работ приводить все окончания строк к единому виду — \n, он же LF. Почему так? Большинство серверов работают под управлением систем на базе Unix, поэтому, на мой взгляд, логично использовать nix’овые окончания строк и для файлов движка сайта.

Теперь опишу свой способ приведения конца строк к единому виду. Описывать работу буду на примере графической оболочки Git – Git GUI. Так проще и нагляднее.

  1. Кладу все файлы движка в папку – например, Original.
  2. Удаляю всякие временные файлы и прочий мусор.
  3. В пустые папки, которые тем не менее необходимы для работы сайта, кладу файл readme.txt. Это надо по той причине, что Git отслеживает только файлы, а не папки. Поэтому если закоммитить в Git движок с пустыми папками, то потом при выгрузке движка этих пустых, но нужных папок мы не увидим.
  4. Открываю пункт меню «Редактировать» -> «Настройки» и указываю имя пользователя, email и кодировку файлов проекта.
  5. В файлах настроек Git – gitconfig — для параметра core прописываю:
    • autocrlf = input
    • safecrlf = warn

или выполнить команды:

  • $ git config —global core.autocrlf input
  • $ git config —global core.safecrlf warn

Первый параметр дает команду Git заменить все окончания строк с CRLF в LF при записи в репозиторий.

Второй – выдает предупреждения о конвертации специфических бинарников, если вдруг такие окажутся в движке.

  • Теперь записываю все файлы движка в репозиторий. В итоге в репозитории все файлы будут иметь концы строк LF или CR (т.к. Git сконвертировал только CRLF в LF, преобразование CR->LF от не выполняет).
  • Запускаю Git GUI, выбираю «Склонировать существующий репозиторий».
  • В строке «Исходное положение» указываю папку Original.
  • В строке «Каталог назначения» указываю полный пусть к папке, в которую я хочу скопировать репозиторий из папки Original. В данном случае я указал папку Target. Важно: папки с таким именем на диске быть не должно. Git GUI создаст ее сам.
  • Выбираю «Полная копия».
  • Жму «Склонировать».
    1. В результате этой манипуляции у нас на диске C появилась папка Target, в которой лежат файлы из репозитория папки Original. Т.е. в папке Target все концы строк приведены к формату LF или CR.
    2. Заходим в папку Target, видим в ней папку .git – удаляем эту папку.

    1. Открываем редактор Notepad++, выбираем пункт меню «Вид» -> «Отображение символов» -> отмечаем «Отображать символ Конец строки». Теперь редактор будет нам показывать символы конца строк.

    1. Выбираем пункт меню «Поиск» -> «Искать в файлах». В настройках поиска выбираем:
      • Режим поиска – Расширенный
      • Папка – C:\Target
      • Найти — \r

    1. В итоге мы найдем все файлы, которые имеют концы строк в формате Mac, т.е.\r или CR. Вряд ли их будет много, но иногда встречаются. Открываем каждый файл по очереди в том же редакторе Notepad++. Мы сможем визуально увидеть, что у файла концы строк в формате Mac:

    1. Преобразуем его в Unix формат. Выбираем «Правка» -> «Формат Конца Строк» -> «Преобразовать в UNIX-формат»

    1. В итоге файл преобразуется в UNIX-формат.

    1. Сохраняем файл и выполняем аналогичное преобразование для всех оставшихся файлов в формате Mac. В итоге в папке Target мы будем иметь движок, все файлы которого будут иметь конец строк Unix-формата LF.

    Теперь движок можно класть в репозиторий Git. И не забудьте в редакторе, которым выпотом будете править файлы, выставить по умолчанию концовку строк LF, чтобы опять не возникла мешанина.

    Еще записи по теме

    Такую петлю через git пришлось делать потому что CRLF концов много? Если я правильно понял, во всех файлах можно было сделать «Правка» -> «Формат Конца Строк» -> «Преобразовать в Win-формат»

    Admin: да, можно в каждом файле отдельно формат концов строк поменять. Но т.к. файлов очень много, то пока не придумал ничего лучше такого вот «пакетного» изменения сразу во всех файлах.

    Спасибо. Долго искал. Изощрённый метод однако

    Как раз с данной ошибкой (LF will be replaced by CRLF ) столкнулся, но смотрю что в Нетбинсе «Правка»->»Замена», выбираем что регулярка и пишем с \r\n на \n и оно во всех файлах приведет к линуксовскому виду, ну типа того что вы добились гитом

    Все тоже самое что и в статье, только проще, в Notepad++

    CTRL-F >> ‘Найти в файлах’

    1. Выбираем ‘Режим поиска’ >> ‘Расширенный’

    2. В поле ‘Папка’ выбираем папку с проектом

    3. В поле ‘Найти’ пишем ‘\r\n’

    4. В поле ‘Заменить на’ пишем ‘\n’

    5. Жмем ‘Заменить в файлах’

    6. После замены возвращаемся к шагу #3 и пишем ‘\r’, жмем заменить

    Читайте также:  Хранители паролей для windows
    Оцените статью