在 python 2.7.15 中有条件地替换行结尾

Replacing line endings conditionally in python 2.7.15

不幸的是,我有一些 svn 补丁有混合的行结尾。我的 Windows svn 客户端(乌龟)使用 CRLF 行结尾保存其元数据。但是,我的同事在 MacOS 上使用 Cornerstone 来应用需要元数据具有 LF 行结尾的补丁。我不能批量更改文件中的所有行结尾(与管理一起处理)。我只需要更改元数据的行尾。

我能够很好地检测到我的补丁文件中的 CRLF 行结尾,但是尝试用 LF 替换它们是行不通的。任何人都可以帮忙吗?如果有更有效的方法,请告诉我。

我正在使用 python 2.7.15

import sys
import os

CRLF = '\r\n'
LF = '\n'

filePath = sys.argv[1] 
newFilePath = filePath.replace('.patch', '-converted.patch')

newFile = open(newFilePath,'wb')
oldFile = open(filePath, 'r+b')

for idx,line in enumerate(oldFile.readlines()):
        line = str(line)
        if line.startswith("=====") or line.startswith("@@") or line.startswith("+++") or line.startswith("---") or line.startswith("Index:"):
                if line.endswith(CRLF):
                        print ("detected CRLF at line " + str(idx))
                        line.replace(CRLF, LF)
                        print ("converted line ending to LF at line " + str(idx))
                        if line.endswith(CRLF):
                                print("hmm... line " + str(idx) + " still a crlf line!!!!!!!!")
        newFile.writelines(line)

oldFile.close()
newFile.close()

replace 方法不会更新调用它的对象,而只是 returns 将替换的字符串作为返回值,因此您需要将返回值分配回变量以获得更新了。

更改此行:

line.replace(CRLF, LF)

至:

line = line.replace(CRLF, LF)