Python 字符串处理与格式化

AI 辅助生成本文由 AI 起草并经人工核查,示例均标明软件版本;发现错误请以官方文档为准。

Python 3.13

文本处理是日常最常做的事:日志、配置、接口返回都要和字符串打交道。这一篇讲字符串的写法、常用方法和格式化。

环境准备

示例在 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。

下一步