python - 在 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
方法不会更新调用它的对象,而只是将替换的字符串作为返回值返回,因此您需要将返回值分配回变量以使其更新。
更改此行:
line.replace(CRLF, LF)
至:
line = line.replace(CRLF, LF)
推荐阅读
- c++ - 插入新元素后,存储在向量中的结构字段的 C++ 值发生变化
- python - 在python中的选定行(最长子序列)上应用聚合函数
- sapui5 - 如何去掉 UI5-routing 中 URL 中的井号(`#`)?
- powershell - PowerShell Azure 函数 - 使用内部函数
- rust - actix-web 客户端将有效负载作为流处理
- laravel - Composer 错误在 Windows 10 中安装 laravel/installer
- c++ - 表达式必须具有类类型并推送一个类
- python - 在 python 或 reactjs 中使用字典创建文本、值对
- deep-learning - 为什么 MLP 比 CNN 和 LSTM 有更好的性能?
- python - 使用 cartopy 在背景地图上绘制数组