Я пытаюсь преобразовать большое количество файлов в общие концы строк с помощью этого скрипта. Сценарий вызывается в 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)
Я пробовал ваш код буквально, скопировать-вставить, и он отлично работает на 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)
Вы можете использовать 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'
вместо этого должно выполнять эту работу.