首页 > 解决方案 > 在 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()

标签: pythonpython-2.7tortoisesvnline-endingscornerstone

解决方案


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

更改此行:

line.replace(CRLF, LF)

至:

line = line.replace(CRLF, LF)

推荐阅读