字符串是 Python 中最常用的数据类型之一,处理文本几乎避不开它。这一节把日常开发中最核心的四个方面讲清楚:编码问题怎么解、常用方法有哪些、f-string 怎么用、以及原始字符串在什么场景下有用。
字符编码:从“乱码”到“不乱码”
很多新手在处理文件读写、网络请求时会碰到 UnicodeDecodeError 或一堆看不懂的符号,这其实是编码和解码没有对应上。
- 本质:计算机只认二进制,字符到二进制的映射方式就是“编码”;把二进制再变回字符就是“解码”。
- Python 3 的字符串模型:
str类型存的是 Unicode 字符(人类能读懂的文本),在内存中以统一方式表示。bytes类型存的是 原始字节(一段二进制数据),只有和特定编码结合时才有字符意义。- 两者之间转换必须显式调用
encode()和decode(),并指定编码(如utf-8、gbk)。 - 实用指南:
- 代码文件第一行添加
# -- 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% 的文本处理需求,并且写出的代码更健壮、更易读。