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

与 split('\n') 不同,splitlines() 更智能,它能识别所有常见的换行符,包括在不同操作系统上使用的不同换行符(如 \n, \r\n, \r 等),并且能正确处理一些特殊的“行边界”情况。
语法
str.splitlines(keepends=False)
-
参数:
keepends(可选): 这是一个布尔值,默认为False。- 如果为
False(默认),则返回的列表中不包含换行符。 - 如果为
True,则返回的列表中会包含每一行末尾的换行符。
- 如果为
-
返回值:
一个列表,其中包含了字符串被分割后的每一行。
(图片来源网络,侵删)
工作原理:识别哪些是“换行符”?
splitlines() 方法会根据 Unicode 标准(或 Python 的定义)来识别以下字符作为“行边界”:
\n- Line Feed (LF),Unix 和 macOS (及更高版本) 的标准换行符。\r- Carriage Return (CR),旧版 Mac OS 的标准换行符。\r\n- Carriage Return + Line Feed (CR+LF),Windows 的标准换行符。\v或\x0b- Line Tabulation (垂直制表符)。\f或\x0c- Form Feed (换页符)。\x1c- File Separator (文件分隔符)。\x1d- Group Separator (组分隔符)。\x1e- Record Separator (记录分隔符)。\x85- Next Line (C1 Control Code)。\u2028- Line Separator (Unicode 行分隔符)。\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()就能得到干净的结果。
