Python中换行符需分场景处理:print用\n手动换行;input自动剥离\n;sys.stdin.readline保留\n;文件写入时文本模式自动转换\n为系统换行符;正则需re.S/re.M标志才能跨行匹配。

Python 里想“打出来”换行符,关键得先分清:你是想在代码里表示换行,还是想让程序运行时输出换行,或是想从键盘输入一个真正的换行符(比如用户按 Enter)——这三者完全不是一回事,混淆就会出错。
print() 里怎么让文字换行
最常见需求:用 print() 输出多行内容。Python 默认每个 print() 结尾自动加 \n,但如果你想在单次调用里换行,就得手动写 \n:
print("第一行\n第二行\n第三行")注意:\n 是字符串里的转义字符,必须写在引号内;单独写 \n(没引号)会报 SyntaxError。
容易踩的坑:
立即学习“Python免费学习笔记(深入)”;
- 误写成
\\n或/n—— 前者输出字面量反斜杠+n,后者只是普通斜杠+n,都不换行 - 用
input()读入的内容,末尾自带的\n已被 Python 自动剥离,不会出现在返回的字符串里
键盘输入时怎么捕获换行符
input() 的设计就是“读到回车就停”,它**不会把换行符传给你**。所以你无法用 input() 直接拿到包含 \n 的字符串。真要这么做,得换方式:
- 用
sys.stdin.read(1)逐字节读,遇到\n就停下(需提前import sys) - 用
sys.stdin.readline()—— 它会保留末尾的\n,而input()不会 - Windows 下按 Ctrl+Z(Unix/Linux/macOS 下按 Ctrl+D)可触发 EOF,配合循环读取多行
示例(保留换行):
import sys line = sys.stdin.readline() # 输入 "abc" + 回车 → line 是 "abc\n"
文件写入时换行符的平台差异
Python 在不同系统写文件时,默认用本地换行符:\n(Linux/macOS)、\r\n(Windows)。但如果你显式写 \n,Python 会在文本模式下自动转换(即“universal newlines”):
- 用
open(..., 'w')写"a\nb"→ Windows 文件里存的是a\r\nb - 用
open(..., 'wb')(二进制模式)写b"a\nb"→ 原样写入\n,不转换 - 想强制写死
\r\n,只能用二进制模式,或手动替换:text.replace("\n", "\r\n")
正则匹配换行符为什么经常失败
默认情况下,正则的 . 不匹配 \n,^ 和 $ 只匹配字符串首尾,不匹配每行首尾。要让它跨行工作,必须加标志:
-
re.DOTALL或re.S:让.匹配包括\n在内的所有字符 -
re.MULTILINE或re.M:让^和$匹配每行开头/结尾 - 两者可组合:
re.search(r"^start.*end$", text, re.M | re.S)
不加这些标志,哪怕文本里有换行,^foo.*bar$ 也只会在单行内找,跨行就失效。
真正麻烦的地方在于:同一个 \n,在字符串字面量、文件 I/O、终端输出、正则引擎、键盘输入缓冲区里的行为和可见性全都不一样。别指望一个写法通吃所有场景。










