我正在尝试将大量文件转换为此脚本的公共行结尾。该脚本使用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)
答案 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'
可以完成这项工作。