人人都会AI编程

8.2 字符串:编码、常用方法、f-string 格式化、原始字符串

更新时间:2026-07-12

字符串是 Python 中最常用的数据类型之一,处理文本几乎避不开它。这一节把日常开发中最核心的四个方面讲清楚:编码问题怎么解、常用方法有哪些、f-string 怎么用、以及原始字符串在什么场景下有用。

字符编码:从“乱码”到“不乱码”

很多新手在处理文件读写、网络请求时会碰到 UnicodeDecodeError 或一堆看不懂的符号,这其实是编码和解码没有对应上。

  • 本质:计算机只认二进制,字符到二进制的映射方式就是“编码”;把二进制再变回字符就是“解码”。
  • Python 3 的字符串模型
  • str 类型存的是 Unicode 字符(人类能读懂的文本),在内存中以统一方式表示。
  • bytes 类型存的是 原始字节(一段二进制数据),只有和特定编码结合时才有字符意义。
  • 两者之间转换必须显式调用 encode()decode(),并指定编码(如 utf-8gbk)。
  • 实用指南
  • 代码文件第一行添加 # -- coding: utf-8 --(Python 3 默认就是 UTF-8,但写上可以防编辑器误判)。
  • 读写文件时务必显式指定 encoding='utf-8',而不是依赖系统默认。
  • 处理来自外部(网页、数据库)的字节流时,先搞清楚它的原始编码再做 decode
  • 遇到 UnicodeDecodeError?先打印 type(data),确定是 bytes 还是 str,再核对编码。

常用字符串方法:你的日常工具箱

Python 的字符串方法极为丰富,下面这些是使用频率最高的:

  • 大小写转换
  • s.lower()s.upper()s.title()s.capitalize()
  • 空白处理
  • s.strip()(去首尾空白)、s.lstrip()s.rstrip()
  • 查找与替换
  • s.find(sub)(找不到返回 -1)、s.index(sub)(找不到抛异常)、s.count(sub)
  • s.replace(old, new, count)(返回新字符串,原字符串不变)
  • 拆分与连接
  • s.split(sep):按分隔符拆成列表,默认按空白字符切分。
  • s.rsplit(sep, maxsplit):从右边开始拆分。
  • s.splitlines():按行拆分。
  • sep.join(iterable):用分隔符把可迭代对象(如列表)拼接成字符串,非常常用。
  • 判断型
  • s.startswith(prefix)s.endswith(suffix)
  • s.isdigit()s.isalpha()s.isalnum()s.isspace()
  • 格式化填充
  • s.center(width)s.ljust(width)s.rjust(width)s.zfill(width)

一个实用小例子:解析日志文件中的一行 " INFO 2025-01-01 server started ",提取级别、日期和内容:

line = "  INFO  2025-01-01 server started  "
parts = line.strip().split(maxsplit=2)  # ['INFO', '2025-01-01', 'server started']
level, date, msg = parts

f-string 格式化:以后格式化只用它

Python 提供了多种字符串格式化方式:% 运算符、str.format()、以及从 Python 3.6 开始引入的 f-string(格式化字符串字面量)。f-string 兼顾了可读性和效率,是现在的推荐做法。

  • 基本语法:在字符串前加 f,花括号内直接写表达式。
  name = "Alice"
  age = 30
  print(f"{name} is {age} years old.")   # Alice is 30 years old.
  
  • 表达式求值:花括号里可以是任何有效的 Python 表达式。
  x = 10
  print(f"{x} + 5 = {x + 5}")           # 10 + 5 = 15
  
  • 格式控制:在表达式后加 : 格式说明符
  • 小数位数:f"pi is {3.1415926:.2f}"'pi is 3.14'
  • 千分位:f"{1000000:,}"'1,000,000'
  • 百分比:f"{0.25:.1%}"'25.0%'
  • 对齐与宽度:f"{'hello':>10}" 右对齐,f"{'hello':^10}" 居中。
  • 补零:f"{5:03d}"'005'
  • 调用方法和属性
  data = {"name": "Bob"}
  print(f"Name is {data['name'].upper()}")  # Name is BOB
  
  • 多行 f-string:使用三引号,和普通字符串一样。
  • 为什么不用 format() 了?
  • 代码更短、更易读:变量直接写进槽位,不需要来回对照 {}format() 参数。
  • 性能更好:f-string 在编译时就被评估,比 format()% 都快。

原始字符串:处理反斜杠的救星

在写正则表达式、文件路径(尤其是 Windows)时,反斜杠 \ 经常导致转义混乱。原始字符串就是在字符串前加一个 r,告诉 Python:把反斜杠当普通字符处理,别转义。

  • 常规字符串的困扰
  path = "C:\new_folder\text.txt"   # \n 被解释为换行,不能得到你想要的路径
  
  • 原始字符串的清晰
  path = r"C:\new_folder\text.txt"  # 一切字符都按字面理解
  
  • 正则表达式中的救命稻草
  import re
  pattern = r"\d+\.\d+"   # 匹配像 3.14 这样的数字,不用写 \\d+\\.\\d+
  
  • 注意:原始字符串不能以奇数个反斜杠结尾(因为 \" 可能导致引号转义问题),此时可以使用普通字符串的双反斜杠替代,或者用 \\ 再扩展。

掌握字符串的编码、常用方法、f-string 和原始字符串,你就能应对日常 90% 的文本处理需求,并且写出的代码更健壮、更易读。