Замена одного символа двумя (\ n на \ r \ n) заменяет также один из заменяющих символов

1

Я пытаюсь преобразовать большое количество файлов в общие концы строк с помощью этого скрипта. Сценарий вызывается в git-shell, используя для цикла.

После запуска всех окончаний строки имеет только CR, когда заканчивается строка. Я полагаю, что replace (contents,\n ','\r\n ') заменяет также \n после\r. Есть ли возможность предотвратить это? Должен ли я заменить linewise?

import sys
import string
import os.path

for file in sys.argv[1:]:
    if not os.path.exists(file):
        continue
    contents = open(file, 'rb').read()
    cont1 = string.replace(contents, '\n', '\r\n' )
    open(file, 'wb').write(cont1)
  • 1
    Вы знаете, что в git эта функция встроена? Нет необходимости в сценарии: help.github.com/articles/dealing-with-line-endings
  • 0
    Я использую git shell только как bash на windows. Исходники менеджера в SVN в проекте. Я хотел только конвертировать XML-файлы, потому что парсер, кажется, ломается, когда происходят смешанные окончания строк. Другие файлы должны оставаться как есть.
Показать ещё 1 комментарий
Теги:

2 ответа

2
Лучший ответ

Я пробовал ваш код буквально, скопировать-вставить, и он отлично работает на python2.7:

bash$ cat file1
one
two

bash$ file file1
file1: ASCII text

bash$ hd file1
00000000  6f 6e 65 0a 74 77 6f 0a                           |one.two.|
00000008

bash$ python2 lineend.py file1

bash$ hd file1
00000000  6f 6e 65 0d 0a 74 77 6f  0d 0a                    |one..two..|
0000000a

bash$ file file1
file1: ASCII text, with CRLF line terminators

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

import sys
import string
import os.path

for file in sys.argv[1:]:
    if not os.path.exists(file):
        continue
    f = open(file, 'rb')
    contents = f.read()
    f.close()
    cont1 = string.replace(contents, '\n', '\r\n' )
    open(file, 'wb').write(cont1)
  • 0
    Хорошо спасибо! Ты прав. Файлы содержали смешанные окончания строк. \ Rs получены не из строки замещения, а из некоторого распространения \ r \ n среди unix-enidngs.
1

Вы можете использовать re.sub для выполнения подстановки регулярных выражений.

Вместо этой строки:

cont1 = string.replace(contents, '\n', '\r\n' )

Вы должны использовать следующую строку (не забудьте import re):

cont1 = re.sub(r'([^\r])\n', r'\g<1>\r\n', contents)

Обновить:

r'([^\r])\n' не будет соответствовать новой строке в начале файла. Использование r'([^\r])?\n' вместо этого должно выполнять эту работу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню