Python 字符串处理与格式化
AI 辅助生成本文由 AI 起草并经人工核查,示例均标明软件版本;发现错误请以官方文档为准。
文本处理是日常最常做的事:日志、配置、接口返回都要和字符串打交道。这一篇讲字符串的写法、常用方法和格式化。
环境准备
示例在 Python 3.13 下验证,交互式验证可直接用 python 进入 REPL。
创建字符串
a = "双引号"
b = '单引号'
c = """多行
字符串"""
三种引号等价,选一种保持统一即可。想让反斜杠不转义,用原始字符串:
path = r"C:\Users\me\notes.txt" # \n 不会被当成换行
多行字符串常用于 SQL、文档字符串:
sql = """
SELECT id, name
FROM users
WHERE id = ?
"""
索引与切片
字符串是不可变序列,可以按下标取字符,但不能改某个字符:
text = "Python"
text[0] # 'P'
text[-1] # 'n',负数从末尾数
text[0:2] # 'Py',含起点不含终点
text[::-1] # 'nohtyP',步长 -1 即反转
text[0] = "p" # TypeError: 'str' object does not support item assignment
常用方法
方法都返回新字符串,原字符串不变:
s = " Python,Go,Rust "
s.strip() # 'Python,Go,Rust',去掉两端空白
s.split(",") # [' Python', 'Go', 'Rust ']
", ".join(["a", "b"]) # 'a, b'
s.replace("Go", "Java") # 替换
s.lower() # 'python,go,rust'
判断与查找:
"python" in s.lower() # True,成员判断
s.strip().startswith("Py") # True
s.find("Go") # 8,找不到返回 -1
s.count(",") # 2
find 找不到返回 -1 而不是报错,需要报错语义时用 index()。
清洗输入的固定套路是 strip() + lower() + split():
raw = " Python , Go "
langs = [part.strip() for part in raw.split(",")]
# ['Python', 'Go']
f-string 格式化
Python 3.6 之后首选 f-string,可读性和性能都好:
name = "小明"
score = 92.5
print(f"{name} 得分 {score}")
# 小明 得分 92.5
花括号里可以放表达式,冒号后是格式规范:
f"{score:.1f}" # '92.5',保留 1 位小数
f"{score:>8.1f}" # ' 92.5',宽度 8 右对齐
f"{1234567:,}" # '1,234,567',千分位
f"{0.873:.1%}" # '87.3%',百分比
f"{name!r}" # "'小明'",!r 调用 repr
调试时可以用 = 同时输出表达式和值(3.8+):
print(f"{score=} {name=}")
# score=92.5 name='小明'
老式的 % 与 str.format() 仍能用,读别人的代码时会遇到:
"%s 得分 %.1f" % (name, score)
"{} 得分 {:.1f}".format(name, score)
新代码统一用 f-string。
str 与 bytes
文本用 str,磁盘和网络传输的是 bytes,两者必须显式转换:
text = "中文"
data = text.encode("utf-8") # b'\xe4\xb8\xad\xe6\x96\x87'
data.decode("utf-8") # '中文'
读写文件时明确写编码,不要依赖系统默认值:
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("中文内容")
常见错误与注意事项
1. 用 + 在循环里拼接
result = ""
for part in parts:
result += part # 每轮都新建字符串,量大时很慢
用 join 一次拼好:
result = "".join(parts)
2. split() 无参 vs 有参
"a b\tc".split() # ['a', 'b', 'c'],按任意空白切,自动去空
"a,,b".split(",") # ['a', '', 'b'],保留空串
3. 混用 str 与 bytes
"abc" + b"def" # TypeError
先 encode 或 decode 再操作。
4. 误改字符串
字符串不可变,替换要用新变量接收:s = s.replace("a", "b")。
小结
- 字符串不可变,方法一律返回新字符串。
- 切分用
split、拼接用join、清洗用strip/lower。 - 格式化优先 f-string,格式规范写在冒号后。
str是文本、bytes是字节,边界处显式encode/decode。