如何稍微修改Python内置函数比如splitlines()的行为?
我的需求是按行分割且保留换行符,只分割 \r\n 的换行,但是 splitlines() 函数默认还会分割 \r 或者 \n 的行。
的确可以通过 split 分割 \r\n,然后在去拼,但是感觉这样很繁琐,如果可以直接重载内置函数把 \r 和 \n 的匹配去掉,这样肯定是最便捷。
不知该如何处理,望指教~
要实现的效果:
str1 = ‘123\r\n456\r789\n000\r\n111’
结果:
[‘123\r\n’, ‘456\r789\n000\r\n’, ‘111’]
如何稍微修改Python内置函数比如splitlines()的行为?
10 回复
有空纠结怎么修改 splitlines 的功夫不如直接 split 自己写一个
# 方法1:直接包装内置函数
def my_splitlines(text, keepends=False):
"""自定义splitlines,在标准行为基础上添加额外处理"""
result = text.splitlines(keepends)
# 这里添加你的自定义逻辑
if keepends:
result = [line + ' [processed]' for line in result]
return result
# 方法2:子类化str(更面向对象的方式)
class MyString(str):
def splitlines(self, keepends=False):
base_result = super().splitlines(keepends)
# 添加自定义处理
return [f"Line {i}: {line}" for i, line in enumerate(base_result, 1)]
# 方法3:猴子补丁(谨慎使用)
original_splitlines = str.splitlines
def patched_splitlines(self, keepends=False):
result = original_splitlines(self, keepends)
# 自定义逻辑
return [line.upper() if keepends else line.lower() for line in result]
# 临时替换(通常只在当前会话有效)
str.splitlines = patched_splitlines
# 测试示例
text = "Hello\nWorld\nPython"
print("方法1测试:", my_splitlines(text))
print("方法2测试:", MyString(text).splitlines())
print("方法3测试:", text.splitlines())
# 恢复原始函数(如果需要)
str.splitlines = original_splitlines
核心思路:
- 包装函数:创建新函数调用原函数并添加逻辑
- 子类化:创建自定义字符串类重写方法
- 猴子补丁:直接替换原函数(可能影响其他代码)
简单建议: 优先使用包装函数或子类化,避免直接修改内置函数。
我记得可以 open(something, “rU”)
不麻烦啊 [ “”.join([line, “\r\n”]) for line in str1.split("\r\n")]
自己写一个有啥难度嘛= =
Monkey-patching
看源码 是不是个类, 继承下?
这个函数加参数 ture 不是保留换行符吗?
class StrMixin:
self.delimiter = ’ \r\n’
def splitelines(self, s): return [k+self.delimiter for k in s.split(self.delimeter)]
谢谢各位!!

