用两个字符替换一个字符(\ n用\ r \ n)也替换了替换字符之一

时间:2018-09-20 12:03:36

标签: python

我正在尝试将大量文件转换为此脚本的公共行结尾。该脚本使用for循环在git-shell中调用。

运行所有行尾后,只有CR作为行尾。我想是因为replace(contents,'\ n','\ r \ n')在\ r之后也会替换\ n。有可能预防吗?我应该逐行替换吗?

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)

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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'可以完成这项工作。