杰瑞科技汇

Python splitlines如何按需分割换行符?

核心概念

splitlines() 是 Python 字符串的一个方法,它的主要作用是按照换行符来分割字符串,并返回一个包含分割后各行的列表。

Python splitlines如何按需分割换行符?-图1
(图片来源网络,侵删)

split('\n') 不同,splitlines() 更智能,它能识别所有常见的换行符,包括在不同操作系统上使用的不同换行符(如 \n, \r\n, \r 等),并且能正确处理一些特殊的“行边界”情况。


语法

str.splitlines(keepends=False)
  • 参数:

    • keepends (可选): 这是一个布尔值,默认为 False
      • 如果为 False (默认),则返回的列表中不包含换行符。
      • 如果为 True,则返回的列表中会包含每一行末尾的换行符。
  • 返回值:

    一个列表,其中包含了字符串被分割后的每一行。

    Python splitlines如何按需分割换行符?-图2
    (图片来源网络,侵删)

工作原理:识别哪些是“换行符”?

splitlines() 方法会根据 Unicode 标准(或 Python 的定义)来识别以下字符作为“行边界”:

  1. \n - Line Feed (LF),Unix 和 macOS (及更高版本) 的标准换行符。
  2. \r - Carriage Return (CR),旧版 Mac OS 的标准换行符。
  3. \r\n - Carriage Return + Line Feed (CR+LF),Windows 的标准换行符。
  4. \v\x0b - Line Tabulation (垂直制表符)。
  5. \f\x0c - Form Feed (换页符)。
  6. \x1c - File Separator (文件分隔符)。
  7. \x1d - Group Separator (组分隔符)。
  8. \x1e - Record Separator (记录分隔符)。
  9. \x85 - Next Line (C1 Control Code)。
  10. \u2028 - Line Separator (Unicode 行分隔符)。
  11. \u2029 - Paragraph Separator (Unicode 段落分隔符)。

关键点: 字符串末尾的换行符不会产生一个空字符串。"hello\nworld\n".splitlines() 会返回 ['hello', 'world'],而不是 ['hello', 'world', '']


用法示例

示例 1:基本用法 (默认 keepends=False)

这是最常见的用法,它会干净地分割每一行,并去除行尾的换行符。

text = "这是第一行,\n这是第二行,\n这是第三行。"
lines = text.splitlines()
print(lines)
# 输出: ['这是第一行。', '这是第二行。', '这是第三行。']

示例 2:保留换行符 (keepends=True)

当你需要保留原始行尾的换行符时,可以使用这个参数。

text = "这是第一行,\n这是第二行,\n这是第三行。"
lines_with_ends = text.splitlines(keepends=True)
print(lines_with_ends)
# 输出: ['这是第一行,\n', '这是第二行,\n', '这是第三行。']

示例 3:处理 Windows 风格的换行符 (\r\n)

splitlines() 能完美处理 Windows 下的文本文件。

text_windows = "第一行\r\n第二行\r\n第三行"
lines = text_windows.splitlines()
print(lines)
# 输出: ['第一行', '第二行', '第三行']

示例 4:处理混合换行符

如果一个字符串中混合了不同操作系统的换行符,splitlines() 也能正确处理。

text_mixed = "第一行\n第二行\r第三行\r\n第四行"
lines = text_mixed.splitlines()
print(lines)
# 输出: ['第一行', '第二行', '第三行', '第四行']

示例 5:处理空字符串和只有换行符的字符串

  • 空字符串: 返回空列表 []
  • 只有换行符的字符串: 返回空列表 [],因为它只包含行边界,没有实际内容。
print("".splitlines())       # 输出: []
print("\n".splitlines())     # 输出: []
print("\r\n\r\n".splitlines()) # 输出: []

示例 6:处理特殊行边界字符

text_special = "第一行\f第二行\x1c第三行"
lines = text_special.splitlines()
print(lines)
# 输出: ['第一行', '第二行', '第三行']

splitlines() vs split('\n') 的关键区别

这是一个非常重要的区别,也是为什么 splitlines() 通常更推荐用于处理多行文本的原因。

特性 str.splitlines() str.split('\n')
识别的换行符 多种 (\n, \r\n, \r, \v, \f 等) \n
Windows 换行符 正确分割 无法分割,\r 会被当作普通字符保留
末尾换行符 不会产生空字符串 产生空字符串
适用场景 处理来自不同来源的文本文件、日志、多行字符串 简单地按 LF 字符分割,或在数据格式中 LF 有特殊含义时使用

对比示例

# 1. 处理 Windows 换行符
text_win = "line1\r\nline2"
print(f"splitlines(): {text_win.splitlines()}")
# 输出: splitlines(): ['line1', 'line2']
print(f"split('\\n'): {text_win.split('\\n')}")
# 输出: split('\n'): ['line1\r', 'line2']  <-- 注意 'line1\r' 中的 \r 被保留了
# 2. 处理末尾的换行符
text_end_newline = "line1\nline2\n"
print(f"splitlines(): {text_end_newline.splitlines()}")
# 输出: splitlines(): ['line1', 'line2']
print(f"split('\\n'): {text_end_newline.split('\\n')}")
# 输出: split('\n'): ['line1', 'line2', '']  <-- 注意多了一个空字符串 ''

  • 当你需要将一个多行字符串分割成一个行列表时,首选 splitlines(),它更健壮、更通用,能处理各种换行符情况,并且行为更符合“按行分割”的直觉。
  • 只有在你明确知道字符串中只包含 \n 作为换行符,或者你需要保留 \r 字符时,才考虑使用 split('\n')
  • keepends=False 是默认行为,通常你只需要 splitlines() 就能得到干净的结果。
分享:
扫描分享到社交APP
上一篇
下一篇